我很难弄清楚如何仅对方法的两个调用之一进行存根。这是一个示例:
class Example
def self.foo
{ a: YAML.load_file('a.txt'), # don't stub - let it load
b: YAML.load_file('b.txt') } # stub this one
end
end
RSpec.describe Example do
describe '.foo' do
before do
allow(YAML).to receive(:load_file).with('b.txt').and_return('b_data')
end
it 'returns correct hash' do
expect(described_class.foo).to eq(a: 'a_data', b: 'b_data')
end
end
end
该测试失败,因为我将第二个调用(YAML.load_file
而不是它遇到的第一个('b.txt'
)的参数加到了对'a.txt'
的调用。我以为参数匹配可以解决这个问题,但事实并非如此。
Failures:
1) Example.foo returns correct hash
Failure/Error:
{ a: YAML.load_file('a.txt'),
b: YAML.load_file('b.txt') }
Psych received :load_file with unexpected arguments
expected: ("b.txt")
got: ("a.txt")
Please stub a default value first if message might be received with other args as well.
有没有一种方法可以允许对YAML.load_file
的第一次呼叫通过,而只保留第二次呼叫?我该怎么做?
答案 0 :(得分:1)
有一个and_call_original
选项(请参阅rspec docs)。
在您的示例中,这应该可以满足您的要求:
before do
allow(YAML).to receive(:load_file).and_call_original
allow(YAML).to receive(:load_file).with('b.txt').and_return('b_data')
end