Rspec检查是否调用方法而不调用方法

时间:2017-11-13 12:44:15

标签: ruby rspec

对于RSpec来说,我是一个新手,虽然我已经阅读了很多关于如何检查方法是否已被调用但我无法找到适合我需要的案例的解决方案。很抱歉,如果这是重复但无法找到任何内容:S

我有一个实现此功能的对象

def link
  paths.each do |old,new|
    FileUtils.ln_s old, new
  end
end

基于路径完成了几个链接(这是一个哈希配对旧文件和新文件)。我对此的测试看起来像这样:

context "linking files to new ones" do
  it "links a sample to the propper file" do
    @comb.link
    expect(FileUtils).to have_received(:ln_s).with("/example/path/files/old.root",
                                             "example/path/nornmfiles/new.root")
  end
end

因为我想测试至少已调用它们必须使用have_received方法,因为只要使用不同的参数调用ln_s方法,接收方法就会失败。问题是测试失败,因为这是一个测试,我真的要创建链接,因为文件不存在所以它不能引发异常,因为文件不存在。

如何在不实际调用方法的情况下测试它?

一旦进行不同的通话,此通话也会失败

  it "links a sample with a region subpath to the propper file" do
    expect(FileUtils).to receive(:ln_s).with("/example/path/files/pathsuff/old.root",
                                             "/example/path/normfiles/pathsuff/new.root").at_least(:once)
    @comb.link
  end

它给出了这个错误:

RSpec::Mocks::MockExpectationError: FileUtils received :ln_s with unexpected 
arguments
   expected: ("/example/path/files/pathsuff/old.root", 
 "/example/path/normfiles/pathsuff/new.root")
   got: ("/example/path/files/old.root", 
 "/example/path/normfiles/new.root")

使用可能发生的可能被称为

的不同方法的其他调用

2 个答案:

答案 0 :(得分:6)

context "linking files to new ones" do
  it "links a sample to the propper file" do
    allow(FileUtils).to receive(:ln_s)

    @comb.link

    expect(FileUtils).to have_received(:ln_s).with(
      "/example/path/files/old.root",
      "example/path/nornmfiles/new.root",
    ).at_least(:once)
  end
end

答案 1 :(得分:1)

如果你不关心实际的论点(而是简单的通话次数)

expect(FileUtils).to receive(:ln_s).with(anything, anything).exactly(paths.length).times
@comb.link

如果您关心参数

expect(FileUtils).to receive(:ln_s).with('foo', 'bar').ordered
expect(FileUtils).to receive(:ln_s).with('foo2', 'bar2').ordered
expect(FileUtils).to receive(:ln_s).with('foo3', 'bar3').ordered
@comb.link