2011-11-04 56 views
2

我试图设置Cookie在我的集成测试,就像这样:不能在轨测试签署饼干3集成测试

cookies.signed[:test] = 1 

这种失败:

NoMethodError: undefined method 'signed' for #<Rack::Test::CookieJar> 

据如我所知,这是因为唯一支持“signed”的cookiejar是ActionDispatch :: Cookie :: CookieJar类型。

我试着解决方法outlined here,但后来我得到:

NoMethodError: undefined method 'env' for nil:NilClass 

有的潜入轨道源给我看,这是由于我传递一个零“请求”的事实目的。

事实证明,无论我如何获得它,请求都是零 - @request为零,self.request为零,open_session.request为零 - 没有办法获得非零的“请求”对象。

如果我尝试创建我自己的请求对象,我得到错误提到by this person,但没有发布的解决方案在那里工作。你可能会猜到,我一直在拼命地在墙上抨击我的头,试图找出我错过的东西。有没有办法设置这个签名的cookie?

+0

如果有人需要手动设置cookie,我会将问题保留开放 – Atiaxi

回答

1

回答我的问题,因为我找到了一个解决办法:

在我的情况,我正试图设置cookie的,因为我是测试控制器依靠它被设置。但是,在实际的应用程序中,还有另一个控制器实际上将Cookie设置为开头。这是一个集成测试,我现在可以自由地调用其他控制器,并让它做我一直在尝试做的事情。这有点麻烦而且慢一些,但它完成了工作。

2

这似乎是固定的Rails 3.2,我可以使用

cookies.signed[:test] = 1 

没有烦恼了。

无论如何,如果你需要设置手动请求一个签名的cookie(这仅仅是一个哈希),你可以使用下面的代码生成:

request.cookies['test'] = ActiveSupport::MessageVerifier.new(Rails.application.config.secret_token).generate(1) 
+1

不,您不能。在请求测试的Rails 3.2.13中,'cookies'仍然返回'Rack :: Test :: CookieJar'。 –

0

至于导轨5推移,生成集成测试中签署的饼干,我发现下面的辅助方法是非常有用的:

def generate_signed_cookie_value(value, digest = 'SHA1', serializer = Marshal) 
    salt = Rails.application.config.action_dispatch.signed_cookie_salt 
    secret = Rails.application.key_generator.generate_key(salt) 

    ActiveSupport::MessageVerifier.new(secret, digest: digest, serializer: serializer).generate(value) 
end 

然后在你的集成测试,你可以做到以下几点:

test 'something using signed cookies' do 
    self.cookies['my-signed-cookie'] = generate_signed_cookie_value('some-value') 

    get '/' 

    # cookies.signed['my-signed-cookie'] should be valid now 
end