【问题标题】:Trouble with RSpec's with methodRSpec 的 with 方法有问题
【发布时间】:2011-02-09 21:07:21
【问题描述】:

我编写了以下规范:

它“应该调用 user.invite_friend” 用户 = mock_model(用户,:id => 1) other_user = mock_model(用户,:id => 2) User.stub!(:find).with(user.id).and_return(user) User.stub!(:find).with(other_user.id).and_return(other_user) user.should_receive(:invite_friend).with(other_user) 发布:邀请,{ :id => other_user.id },{:user_id => user.id} 结尾

但是当我运行规范时出现以下错误

'UsersController POST 邀请中的 NoMethodError 应调用 user.invite_friend' # Class:0x86d6918 的未定义方法“find” app/controllers/users_controller.rb:144:in `invite' ./spec/controllers/users_controller_spec.rb:13:

错在哪里?没有 .with 它工作得很好,但我希望存根方法的不同参数有不同的返回值。以下控制器的操作可能是相关的:

定义邀请 me.invite_friend(User.find 参数[:id]) respond_to 做 |格式| format.html { redirect_to user_path(params[:id]) } 结尾 结尾 定义我 用户.find(会话[:user_id]) 结尾

【问题讨论】:

    标签: ruby-on-rails rspec mocking


    【解决方案1】:

    出现错误是因为第一次调用 find 时存根被“用完”。第二个find 没有被存根,所以你得到了NoMethodError。

    如果我错了,有人可以纠正我,但.with 在您不止一次调用它时似乎会对存根产生奇怪的影响。 Rspec 似乎将同一参数类型的每条消息 与单个存根相关联。但是另一种参数类型有效地创建了不同的存根。因此,在您的情况下,您可以通过使用字符串调用第二个 find 来修复它:

    User.stub!(:find).with(other_user.id.to_s).and_return(other_user)

    这对你来说是幸运的,因为实际上控制器期望 params 哈希中的字符串。

    这并没有回答更大的问题:如何使用相同参数类型的参数存根多个方法调用?根据我的经验,你不能这样做。

    当然,您可以完全不指定参数来绕过它。在您的情况下,我会说测试 find 本身与您的控制器无关 - 实际上,您正在测试 ActiveRecord 是否可以对已经很好测试的主键进行数据库查找。因此,如果您只需要以正确的顺序存根对find 的响应,您可以这样做:

    User.stub!(:find).and_return(user,other_user)

    【讨论】:

    • “这并不能回答更大的问题:如何使用相同参数类型的参数存根多个方法调用?根据我的经验,你不能这样做。”存根方法可以接收一个带有参数作为参数的块,并且您可以根据该参数的值返回不同的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多