【问题标题】:Failure/Error: expected: 1 time with any arguement, recieved: 0 times with any arguments失败/错误:预期:1 次带有任何参数,收到:0 次带有任何参数
【发布时间】:2014-08-12 22:11:14
【问题描述】:

我有一个下面的规范,我是 mocking 我的用户模型和 stubbing 它的方法。

require 'spec_helper'

describe User do 

  let(:username) {"test@test.com"}
  let(:password) {"123"}
  let(:code) {"0"}

  context "when signing in" do
    let(:expected_results) { {token:"123"}.to_json }

    it "should sign in" do 
      expect(User).to receive(:login).with({email: username, password: password, code: code})
        .and_return(expected_results)
    end

  end    
end

当我尝试运行我的测试用例时,出现以下错误。

Failure/Error: expect(User).to receive(:login).with({email: username, password: password, code: code})
       (<User (class)>).login({:email=>"test@test.com", :password=>"123", :code=>"0"})
           expected: 1 time with arguments: ({:email=>"test@test.com", :password=>"123", :code=>"0"})
           received: 0 times

【问题讨论】:

  • 所以,要清楚,您有一个名为 login 的用户方法?并且没有定义控制器动作。您希望在什么时候调用 User.login?你什么时候做sessions#create?没有调用该控制器方法...或任何控制器方法。
  • 也许您可以在问题中包含您的会话控制器代码和用户模型?但是,如果这是一个模型单元测试,那么在这种情况下模拟是不合适的。

标签: ruby-on-rails ruby ruby-on-rails-3 rspec


【解决方案1】:

您误解了expect 是什么。

expect(x).to receive(:y) 正在对 x 上的 y 方法进行存根。

也就是说,它正在掩盖那个方法。

描述这一点的一种方式是,您正在“期望在您实际运行代码时,方法 y 将在 x 上被调用”

现在,您的规范没有调用任何实际代码...它只是设置期望...然后停止。

如果您正在测试方法login,那么您不需要带着期望将其剔除,而是实际调用它。

例如User.login(email: username, password: password, code: code)

您目前实际上根本没有进行测试。只是你设置的一个存根,然后从不使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-16
    • 2017-07-15
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多