对于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")
使用可能发生的可能被称为
的不同方法的其他调用答案 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