【问题标题】:Expectation for find not working, but expectation for find_by_id is对 find 的期望不起作用,但对 find_by_id 的期望是
【发布时间】:2023-03-12 15:09:01
【问题描述】:

我有这个控制器代码:

# GET /cardsets/1
def show
  @cardset = current_user.cardsets.find_by_id(params[:id])
end

还有这个 RSpec 测试代码(用 Mocha 模拟):

# GET Show
context "on get to show" do
  it "should assign cardset" do
    @cardset = Factory(:cardset)
    @profile = @cardset.profile

    @profile.cardsets.expects(:find).once.returns(@cardset)
    get :show, :id => @cardset.id
    assigns[:cardset].should_not be_nil
  end
end

此测试失败:

2)
Mocha::ExpectationError in 'CardsetsController for a logged in user on get to show should assign cardset'
not all expectations were satisfied
unsatisfied expectations:
- expected exactly once, not yet invoked: [#<Cardset:0x1032bb660>].find(any_parameters)
satisfied expectations:
- allowed any number of times, not yet invoked: ApplicationController.require_user(any_parameters)
- allowed any number of times, already invoked twice:     #<CardsetsController:0x10336c578>.current_user(any_parameters)

如果我将期望更改为:

@profile.cardsets.expects(:find_by_id).once.returns(@cardset)

那么测试就通过了,为什么这个用find_by_id会通过而找不到呢?

【问题讨论】:

    标签: ruby-on-rails unit-testing rspec mocha.js stubbing


    【解决方案1】:

    我认为这是因为findfind_by_id 实际上是不同的消息。您的控制器使用find_by_id,但您将消息期望设置为查找find

    【讨论】:

    • 不敢相信我没有看到。我有另一个类似的问题。 #new 操作的设置与 #show 操作相同,除了它调用 current_user.cardsets.build 时使用此 @profile.cardsets.expects(:build).returns(Factory.stub(:cardset)) 来期待它,我得到一个失败的测试,说它没有被调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 2020-12-02
    • 2020-06-26
    • 1970-01-01
    相关资源
    最近更新 更多