Ruby 在Rspec中将一个'put'模拟到一个文件中

Ruby 在Rspec中将一个'put'模拟到一个文件中,ruby,rspec,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 "#

我有一个愚蠢的“队列类[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
运行此命令失败,因为我的mock从未收到预期的“open”和“put”消息

我可以用这种方式模拟
文件吗?我是否正确使用了
任何\u实例
;我试图存根“块收益率”是否正确

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

[1] 班级是从哪里来的;但这些测试与黄瓜本身几乎没有关系。我在读这本书的时候,不知怎的打破了密码;并且想通过为本书没有编写测试的部分编写单元测试来找出什么:helper类。

您希望接收
打开方法的不是
文件
类的“任何实例”;这是
文件
类本身:

  File.stub(:open).and_yield(open_file)
  File.should_receive(:open)
此外,不要同时使用存根和期望。如果要验证是否实际调用了
File.open

  File.should_receive(:open).and_yield(open_file)
如果您只想在调用
open
方法时将其存根,但不想将其作为
@队列的行为。write
方法:

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

(这是从内存中获取的,我已经几个月没有使用RSpec了。)

最新版本的RSpec中不推荐使用存根。如果有人想这样做,请尝试以下方法:
allow(File).to receive(:open).and_yield(open_File)