Ruby 在Rspec中将一个'put'模拟到一个文件中
我有一个愚蠢的“队列类[1]”,它包含以下方法,我想用Rspec对其进行规范。我对测试写入文件系统是否有效(它有效,我的计算机有效)不感兴趣,而是对正确的数据是否被写入感兴趣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 "#
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)