【问题标题】:How do you cause an expectation to halt execution in RSpec?你如何导致期望在 RSpec 中停止执行?
【发布时间】:2016-08-31 16:50:04
【问题描述】:

我想测试一个类在 RSpec 中接收到一个类方法调用:

describe MyObject do
  it "should create a new user" do 
    expect(User).to receive(:new)
    MyObject.new.doit
  end
end

class MyObject
  def doit
    u = User.new
    u.save
  end
end

问题在于期望不会停止执行。它只是将类方法.doit 存根并继续执行。

期望的效果是保证User.new返回nil。因此,当我们到达下一行 User.save 时,它会失败,因为没有用户对象可以调用 .save

我希望在满足 RSpec 期望后立即停止执行 - 我该怎么做?

注意

这只是一个说明性示例 - 虽然 expect to change 适用于 User.new,但我需要测试的不是这段实际代码

【问题讨论】:

    标签: ruby-on-rails rspec


    【解决方案1】:

    这个and_call_original有一个很棒的方法:

    expect(User).to receive(:new).and_call_original
    

    【讨论】:

    • 你美紫蛇——这就是完美
    • 太棒了,很高兴为您提供帮助
    【解决方案2】:

    根据您的测试描述,您正在测试是否已创建记录,在这种情况下,我建议您这样做:

    expect {
      MyObject.new.doit
    }.to change{User.count}
    

    或者如果你想确保它只创建了一个:

    expect {
      MyObject.new.doit
    }.to change{User.count}.by(1)    
    

    【讨论】:

    • 我选择的例子只是一个例子。我同意你所说的,如果我想检查是否创建了用户,但我实际上想测试一种无法使用这种技术进行测试的不同方法。我真的需要测试一个类方法是否被调用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 2020-09-09
    • 1970-01-01
    相关资源
    最近更新 更多