模拟`put`到Rspec中的文件

时间:2012-12-29 11:57:16

标签: ruby rspec

我有一个愚蠢的“队列类[1]”,使用以下方法,我想用Rspec进行规范。我对测试文件系统的工作是否正常(它工作正常,我的计算机工作正常)以及是否正确的数据写入是不感兴趣。

def write transaction
  File.open("messages/#{@next_id}", "w") {|f| f.puts transaction }
  @next_id += 1
end

测试的规格是:

describe TransactionQueue do
  context "#write" do
    it "should write positive values" do
      open_file = mock File
      open_file.stub(:puts)

      File.any_instance.stub(:open).and_yield(open_file)
      File.any_instance.should_receive(:open)
      open_file.should_receive(:puts).with("+100")

      @queue = TransactionQueue.new
      @queue.write("+100")
    end
  end
end

运行它,失败,因为我的Mocks从未收到预期的“打开”和“放置”消息。

我可以用这种方式模仿File吗?我是否正确使用了any_instance;我试图将“块产量”纠正为正确吗?

当可以避免时,我宁愿不使用像FakeFS这样的额外宝石;这不是为了让它发挥作用;主要是关于实际了解正在发生的事情。因此,我试图避免额外的宝石/复杂层。

[1]班级来自The Cucumber Book;但这些测试与黄瓜本身有关。在关注这本书时,我以某种方式破坏了代码;并希望通过编写本书未编写测试的部分的单元测试来找出答案:辅助类。

1 个答案:

答案 0 :(得分:5)

您期望接收File方法的open类不是“任何实例”;它是File类本身:

  File.stub(:open).and_yield(open_file)
  File.should_receive(:open)

此外,不要同时使用存根和期望。如果您想验证实际调用了File.open

  File.should_receive(:open).and_yield(open_file)

如果您只想隐藏open方法以防它被调用,但不想要求它作为@queue.write方法的行为:

  File.stub(:open).and_yield(open_file)

(这是从记忆中,我几个月没有使用过RSpec。)

相关问题