我有一个愚蠢的“队列类[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;但这些测试与黄瓜本身有关。在关注这本书时,我以某种方式破坏了代码;并希望通过编写本书未编写测试的部分的单元测试来找出答案:辅助类。
答案 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。)