在替换原始模拟方法之前,有没有办法在每个期望中模拟一次方法一次?
我认为这样的事情会起作用(注意once
)
class Klass
def self.meth
'baz'
end
end
describe Klass do
subject{ described_class.meth }
before{ allow(described_class).to receive(:meth).once.and_return('foo') }
it{ is_expected.to eq 'foo' }
context 'throwing in a context just to test' do
it{ is_expected.to eq 'foo' }
it{ is_expected.to eq 'foo' }
it{ is_expected.to eq 'foo' }
it 'only mocks once' do
expect(subject).to eq 'foo'
expect(subject).to eq 'baz' # this is the key
end # pass
end
end
不幸的是我收到了这个错误:
(Klass (class)).meth(no args)
expected: 1 time with any arguments
received: 2 times
如果我说expect(Klass).to receive(:meth).once
而不是更宽松的allow
,我原本预计会失败。
我想知道如何按照期望一次嘲笑一次。
答案 0 :(得分:4)
这可能有点不直观,但您可以Klass.meth
Klass.meth
{}进行此操作。
在您的情况下,您可以使用'foo'
存储对Klass.meth
的第一次调用,然后使用原始实现将所有其他调用存根到allow(described_class).to receive(:meth).and_return('foo', described_class.meth)
。方法。看起来像这样:
subject
我们需要在测试中更改的另一件事是在最终测试中不使用Klass.meth
,因为它会记住第一次调用subject
时返回的值(这是为什么使用it 'only mocks once'
的所有其他测试仍然会通过),从而使class Klass
def self.meth
'baz'
end
end
describe Klass do
subject { described_class.meth }
before do
allow(described_class).to \
receive(:meth).and_return('foo', described_class.meth)
end
it { is_expected.to eq 'foo' }
context 'throwing in a context just to test' do
it { is_expected.to eq 'foo' }
it { is_expected.to eq 'foo' }
it { is_expected.to eq 'foo' }
it 'only mocks once' do
expect(described_class.meth).to eq 'foo'
expect(described_class.meth).to eq 'baz'
end # pass
end
end
测试中的第二个期望失败。相反,我们可以直接在每个规范中调用该方法:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"201507234Surat_GDCR.pdf”];
success = [fileManager fileExistsAtPath:filePath];
if (success)
{
NSURL *url = [NSURL fileURLWithPath:filePath];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[webView loadRequest:request];
webView.dataDetectorTypes=UIDataDetectorTypeAll;
}