ruby RSpec:如何测试一个方法是否被调用?

xam8gpfp  于 2023-03-12  发布在  Ruby
关注(0)|答案(4)|浏览(125)

在编写RSpec测试时,我发现自己编写了很多类似这样的代码,以确保在测试执行期间调用了一个方法(为了方便讨论,我们只能说我无法在调用后真正询问对象的状态,因为方法执行的操作不容易看到其效果)。

describe "#foo"
  it "should call 'bar' with appropriate arguments" do
    called_bar = false
    subject.stub(:bar).with("an argument I want") { called_bar = true }
    subject.foo
    expect(called_bar).to be_true
  end
end

我想知道的是:还有比这更好的语法吗?我是不是错过了一些时髦的RSpec,它可以把上面的代码减少到几行?should_receive听起来应该这样做,但进一步阅读,它听起来并不完全是这样做的。

jucafojl

jucafojl1#

it "should call 'bar' with appropriate arguments" do
  expect(subject).to receive(:bar).with("an argument I want")
  subject.foo
end
yxyvkwin

yxyvkwin2#

在新的rspecexpect syntax中,这将是:

expect(subject).to receive(:bar).with("an argument I want")
dgsult0t

dgsult0t3#

以下方法应该有效

describe "#foo"
  it "should call 'bar' with appropriate arguments" do
     subject.stub(:bar)
     subject.foo
     expect(subject).to have_received(:bar).with("Invalid number of arguments")
  end
end

文件:https://github.com/rspec/rspec-mocks#expecting-arguments

dy2hfwbg

dy2hfwbg4#

为了完全符合RSpec ~〉3.1语法和rubocop-rspec规则的默认选项RSpec/MessageSpies,下面是您可以对spy执行的操作:
消息预期将示例的预期放在开始,在您调用被测代码之前。许多开发人员更喜欢使用arrange-act-assert(或given-when-then)模式来构建测试。间谍是一种替代类型的双精度测试,它支持这种模式,允许您使用have_received来预期消息在事实发生后已经收到。

# arrange.
invitation = spy('invitation')

# act.
invitation.deliver("foo@example.com")

# assert.
expect(invitation).to have_received(:deliver).with("foo@example.com")

如果你不使用rubocop-rspec或者使用非默认选项,你当然可以使用RSpec 3默认和expect。

dbl = double("Some Collaborator")
expect(dbl).to receive(:foo).with("foo@example.com")

相关问题