如何使用rspec存根特定文件?

时间:2012-02-12 07:06:03

标签: ruby ruby-on-rails-3 rspec stub

我搜索得很远,我希望有人能回答这个问题。我正在使用以下代码来存根'存在?' 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'方法实际做什么的文档。也许我正在咆哮错误的树。

有人可以提供一些指导吗?

1 个答案:

答案 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等)。