在编写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
听起来应该这样做但是进一步阅读它听起来并不完全是它的作用。
答案 0 :(得分:121)
it "should call 'bar' with appropriate arguments" do
expect(subject).to receive(:bar).with("an argument I want")
subject.foo
end
答案 1 :(得分:97)
在新的rspec
expect
syntax中,这将是:
expect(subject).to receive(:bar).with("an argument I want")
答案 2 :(得分:32)
以下应该有效
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
答案 3 :(得分:2)
要完全遵循RSpec〜> 3.1语法和beforunload
的规则rubocop-rspec
的默认选项,可以使用RSpec/MessageSpies
进行以下操作:
消息期望在开始调用之前先将示例的期望放在首位 被测代码。许多开发人员更喜欢使用Arrange-act-assert(或给定的时间) 结构化测试的模式。间谍是支持此功能的替代测试类型 通过使用以下方式允许您期望事实结束后已收到消息, 已收到。
spy
如果您不使用rubocop-rspec或使用非默认选项。当然,您可以使用带有期望值的RSpec 3默认值。
# arrange.
invitation = spy('invitation')
# act.
invitation.deliver("foo@example.com")
# assert.
expect(invitation).to have_received(:deliver).with("foo@example.com")