如何测试方法是否被调用?

在编写 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听起来应该这样做,但进一步阅读它听起来并不完全是这样做的。

157592 次浏览

下面的步骤应该可以

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

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

在新的 rspec expect语法中,这将是:

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

为了完全符合 RSpec ~ > 3.1语法和 rubocop-rspec规则 RSpec/MessageSpies的默认选项,以下是使用 spy可以做的事情:

消息期望在调用 许多开发人员更喜欢使用 angle- 行为-断言(或者 give- 当-then) 间谍是另一种类型的测试双精度,它支持 通过允许您期望在事后接收到消息,可以使用 已经收到了。

# arrange.
invitation = spy('invitation')


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


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

如果你不使用 rubopolice-RSpec 或者使用非默认选项,当然,你可以使用 RSpec 3默认值。

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