设计,Rspec的,用户的期望

我使用的设计验证和显着什么,我试图做的是测试的方法是在用户对象上调用。 所以,我的规格如下所示:

it "should retrieve something for user" do @user = Factory.create(:user) sign_in @user @user.expects(:something) get :manage end

我的问题是,除非希望我做的失败:

it "should retrieve something for user" do @user = Factory.create(:user) sign_in @user controller.stubs(:current_user).returns @user @user.expects(:something) get :manage end

如果sign_in @user是有一项测试助手伪造出来的控制器上的电话CURRENT_USER似乎做作。 在调试后挖不用时伪造了CURRENT_USER真的正在返回所以林不知道为什么期望没有得到满足的@user也出现。

想法?

--------------解决方案-------------

当前用户在会话存储之前连载; 可能,对于一个ActiveRecord用户模型,它是存储用户的ID:

https://github.com/plataformatec/devise/blob/master/lib/devise/test_helpers.rb#L49

这意味着,当你再次控制器读取用户:

https://github.com/plataformatec/devise/blob/master/lib/devise/controllers/helpers.rb#L47-49

它的发现在盘中USER_ID,并重新从数据库中获取用户。

这意味着由#current_user在控制器返回的用户对象是一个不同的Ruby对象比传递到#sign_in在测试中的@user,所以从一个对象存根和期望没有连接到其他。

我没有使用过设计/监狱长广泛,但我敢肯定这是发生了什么事情。 您可以尝试打印出#object_id的两个实例来证实这一点。

挑剔的语义更新2014年2月:

打桩#current_user控制器上是一个很好的做法在这里,根据您的测试(SUT)了系统的“边界”的定义-也就是您的控制器。 假设#current_user方法是由设计定义并混合到你的控制器通过设计,你可以认为#current_user是外部的SUT,因此公平的游戏的存根。

你可以或者存根设计正在访问(ActiveRecord的),由存根说底层User.find来回报您@user对象。 这意味着你的天赋是测试你的两个行动的执行情况以及在制定实施#current_user ,因此,如果不是这些事情后来改为规范将失败。

比方说,设计使用User.find(args) ,并说你存根方法,然后制定更高版本改为使用User.where(args).first() -你的代码并没有改变,但潜在的库有,你的天赋失败。 非常普遍思考这个想法,有些时候,你可能会喜欢这种行为(想想嘲讽如与WebMock原始的HTTP响应,而不是存根Net::HTTP方法,所以你以后可以交换HTTP库),和时间你不会告发'T(也许这个问题制定计为一个)。

分类:Ruby on Rails的 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.122 (s). 10 q(s)