我正在使用rspec-spies并且想知道在完成所有调用之后是否有办法检查间谍。
例如,如果我做了类似
的事情# setup
Post.stub(:find).with(@post.id).and_return(@post)
do_something_to_call_post_find()
# verify find was called
Post.should have_received(:find).with(@post.id)
这很好用,但是如果Post 没有收到预期的参数,我会收到一条无用的错误消息(基本上“Post应该收到123的查找”)。相反,我想看看对`find
的实际调用是什么。
我可以在do_something_to_call_post_find()
之后暂停,但有没有办法列出存根/间谍的所有调用/参数?
实际用例
今天我抓住了这个 - 我期待Post.should have_received(:find).with(@post.id)
,其中@post.id is an integer
,我的控制器测试将params(包括id)作为字符串传递。如果我可以查看实际的来电,我会看到123
和"123"
之间的区别,这很明显。
答案 0 :(得分:2)
这种不足不再是rspec 2.14.0.rc1中的一个问题,它包含了改进的rspec-spies功能,现在可以在github上使用。
例如,执行以下规范:
class Foo
def self.bar(arg)
end
end
describe "test" do
it "should show differences" do
Foo.stub(:bar)
Foo.bar(123)
Foo.should have_received(:bar).with('123')
end
end
生成以下输出:
F
Failures:
1) test should show differences
Failure/Error: Foo.should have_received(:bar).with('123')
<Foo (class)> received :bar with unexpected arguments
expected: ("123")
got: (123)
# ./foo_spec.rb:10:in `block (2 levels) in <top (required)>'
Finished in 0.00082 seconds
1 example, 1 failure
Failed examples:
rspec ./foo_spec.rb:7 # test should show differences
Peters-MacBook-Air-2:botmetrics palfvin$
更新:根据对https://github.com/technicalpickles/rspec-spies/blob/master/lib/rspec-spies.rb have_received
匹配器定义的检查以及一些非正式测试,似乎可以通过编程方式访问收到的消息,如下所示:
Foo.__send__(:__mock_proxy).instance_variable_get("@messages_received")
其中Foo
是您的测试双倍。