2

我正在使用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”)。相反,我想看看实际调用的`find是什么。

我可以在之后暂停do_something_to_call_post_find(),但是有没有办法列出存根/间谍的所有调用/参数?

实际用例 这个今天抓住了我——我期待Post.should have_received(:find).with(@post.id),在哪里@post.id is an integer,我的控制器测试将参数(包括 id)作为字符串传递。123如果我可以检查实际的调用,我会看到and和之间的区别"123",这将是显而易见的。

4

1 回答 1

4

这个不足在 rspec 2.14.0.rc1 中不再是一个问题,它结合了改进的 rspec-spie 功能,现在可以在 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-sies/blob/master/lib/rspec-sies.rbhave_received上对匹配器定义的检查和一些非正式测试,似乎收到的消息可以以编程方式访问,如下所示:

Foo.__send__(:__mock_proxy).instance_variable_get("@messages_received")

Foo你的测试替身在哪里。

于 2013-07-02T20:32:06.773 回答