【问题标题】:How do I stub out a specific file with rspec?如何使用 rspec 存根特定文件?
【发布时间】:2012-02-12 07:06:03
【问题描述】:

我已经进行了广泛的搜索,希望有人能回答这个问题。我正在使用以下代码来剔除“存在?” 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”方法实际作用的文档。也许我完全找错了树。

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

【问题讨论】:

  • 您收到的失败信息是什么?
  • 嗨,David .. 抱歉,我之前没有看到您的回复。我没有收到失败消息。我只是不知道如何以检查特定文件的方式编写测试。我重新组织了测试以使其正常工作。谢谢。

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


【解决方案1】:

RSpec 存根框架还有一些不足之处,这就是其中之一。 stub!(:something).with("a thing") 确保每次调用 something 方法时,它都会接收 "a thing" 作为输入。如果接收到"a thing" 以外的内容,RSpec 将停止测试并报告错误。

我认为你可以实现你想要的,你只需要以不同的方式处理它。您应该在您的@loader 实例上删除一个方法,而不是存根FileTest,并且该方法通常会调用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 等)。

【讨论】:

  • 你会用 mocha 来做什么,而你不能用 rspec-mocks 做?
  • 感谢您的回复。你的意思是在我的存根版本中,FileTest.stubs!是否被完全排除在所有测试中? (我是这一切的新手,如果我问一个明显的问题,请原谅)。
  • @DavidChelimsky 我并不是说这些库可以实现 OP 想要的,只是他可以尝试它们,看看它们可以为他提供什么。我个人从未使用过 mocha 或 stubba,但我认识拥有并喜欢它们的人。
  • @Agazoom 当您在示例中存根 FileTest 时,每次 在该示例期间调用该方法时,该方法都会被存根。 RSpec 重置在示例期间创建的所有存根,因此 FileTest 将在所有其他示例中正常运行,除非您再次存根。我相信唯一的例外是在 before :all 块中创建的存根。
  • 感谢 cmets。我想我想出了一个行之有效的策略。
猜你喜欢
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多