rspec-spies检查存根方法和方法间谍的调用参数

时间:2013-07-02 15:20:05

标签: rspec rspec2 rspec-rails stub

我正在使用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"之间的区别,这很明显。

1 个答案:

答案 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是您的测试双倍。