【发布时间】:2013-02-04 00:25:55
【问题描述】:
我有一个函数,它接受一个块,打开一个文件,生成并返回:
def start &block
.....do some stuff
File.open("filename", "w") do |f|
f.write("something")
....do some more stuff
yield
end
end
我正在尝试使用 rspec 为其编写测试。如何存根 File.open 以便将对象 f (由我提供)传递给块,而不是尝试打开实际文件?比如:
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
【问题讨论】:
-
这很难测试,因为您要测试的是方法内部。您的文件如何与方法之外的任何内容交互?从您的示例中,您根本不会在方法之外使用该文件,也不会产生它。如果这个函数之外的东西需要文件,那么也许你应该考虑将文件对象传递给方法(依赖注入)。然后你可以模拟文件没问题。如果您确实需要测试有关该文件的某些内容,也许您应该考虑将其分解为一个单独的方法?
-
谢谢...做了类似的事情,分成多个方法,存根几个函数,如 File.stub(open).and_yield(my_double) 等。
标签: ruby rspec mocking rspec2 stubbing