ruby - 如何测试使用 rspec 的 block 的函数

标签 ruby rspec mocking rspec2 stubbing

我有一个函数,它接受一个 block ,打开一个文件,产生并返回:

def start &block
    .....do some stuff
    File.open("filename", "w") do |f|
        f.write("something")
        ....do some more stuff
        yield
    end
end

我正在尝试使用 rspec 为其编写测试。我如何 stub File.open 以便它将对象 f(由我提供)传递给 block 而不是尝试打开实际文件?像这样的东西:

it "should test something" do
    myobject = double("File", {'write' => true})
    File.should_receive(:open).with(&blk) do |myobject|
        f.should_receive(:write)
        blk.should_receive(:yield) (or somethig like that)
    end
end

最佳答案

我想你要找的是yield matchers ,即:

it "should test something" do
  # just an example
  expect { |b| my_object.start(&b) }.to yield_with_no_args
end

关于ruby - 如何测试使用 rspec 的 block 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14955519/

相关文章:

ruby-on-rails - Ruby on Rails 无法 bundle 安装

ruby-on-rails - rspec 测试中所有 get/put 调用错误 w/"no route matches";尽管它们在应用程序中运行良好

python - Pytest:使用 python 线程在程序中模拟/修补 sys.stdin

PHPUnit:期望以数组作为参数的方法调用

ruby-on-rails - 使用 "Ruby on Rails"框架访问 Sharepoint

ruby - 在 Ruby 中使用模数 % 运算符时出现逻辑错误

ruby-on-rails - 在文本字段上设置值

mysql - 在 Ruby on Rails 中,更新的 gem 导致以前通过 Capybara 测试的 mysql 数据库回滚

ruby - Rspec 包在 TextMate 和 rvm 中损坏

java - 使用 Mockito 从模拟中抛出已检查的异常