rspec-spies 检查 stub 方法和方法 spy 的调用参数

标签 rspec rspec2 rspec-rails stub

我正在使用rspec-spies我想知道在打完所有电话后是否有办法检查 spy 。

例如,如果我做类似的事情

# 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()之后暂停,但是有没有办法列出对 stub / spy 的所有调用/参数?

实际用例 今天这个问题吸引了我——我期待着 Post.should have_received(:find).with(@post.id),其中 @post.id 是一个整数 ,我的 Controller 测试将参数(包括 id)作为字符串传递。如果我能够检查实际的调用,我就会看到 123"123" 之间的区别,而且它会很明显。

最佳答案

在 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.rbhave_received 匹配器定义的检查和一些非正式测试,似乎可以通过编程方式访问收到的消息,如下所示:

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

其中 Foo 是您的测试替身。

关于rspec-spies 检查 stub 方法和方法 spy 的调用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17429453/

相关文章:

ruby-on-rails - 如何期望 '=' 方法针对 'session' 运行?

ruby-on-rails - 将默认参数设置为一些 rspec 请求

ruby-on-rails - 任何调试 RSpec 请求规范的方法?

ruby-on-rails - 如何为 spree Controller 装饰器编写测试?

ruby-on-rails-3 - 如何使用 Rspec 测试载波版本大小

ruby - 在 Rspec 中测试 STDOUT 输出

ruby-on-rails - 使用 Capybara 测试文件上传 - 不是表单,而是按钮和 javascript 函数

ruby - 如何在 Rspec 中找到每个测试用例所花费的时间

ruby-on-rails - 如何在 RSpec View Examples 中设置语言环境

ruby - `load_missing_constant' : 未初始化的常量 Mocha::Standalone (NameError)