我搜索得很远,我希望有人能回答这个问题。我正在使用以下代码来存根'存在?' rspec规范中FileTest的方法:
it "returns no error if file does exist" do
@loader = MovieLoader.new
lambda {
FileTest.stub!(:exists?).and_return(true)
@loader.load_file
}.should_not raise_error("File Does Not Exist")
end
我真正想要做的是确保存在特定文件的存在。我希望这样的事情可以做到这一点:
it "returns no error if file does exist" do
@loader = MovieLoader.new
lambda {
FileTest.stub!(:exists?).with(MovieLoader.data_file).and_return(true)
@loader.load_file
}.should_not raise_error("File Does Not Exist")
end
但是,这似乎不起作用。我很难找到关于'with'方法实际做什么的文档。也许我正在咆哮错误的树。
有人可以提供一些指导吗?
答案 0 :(得分:2)
RSpec存根框架有一些不足之处,这就是其中之一。 stub!(:something).with("a thing")
确保每次调用something
方法时它都会收到"a thing"
作为输入。如果收到"a thing"
以外的内容,RSpec将停止测试并报告错误。
我认为你可以实现你想要的,你只需要有所不同。您应该在FileTest
实例上删除一个方法,而不是删除@loader
,而该方法通常会调用FileTest.exists?
。希望这能证明我所得到的:
class MovieLoader
def load_file
perform_loading if file_exists?(file_path)
end
def file_exists?(path)
FileTest.exists? path
end
end
您的测试将如下所示:
it "returns no error if file does exist" do
@loader = MovieLoader.new
lambda {
@loader.stub!(:file_exists?).with(MovieLoader.data_file).and_return(true)
@loader.load_file
}.should_not raise_error("File Does Not Exist")
end
现在您只是存根加载器的一个实例,因此其他实例不会继承存根版本的file_exists?
。如果你需要更细粒度,你可能需要使用不同的存根框架,RSpec支持(stubba,mocha等)。