只模拟一次方法

时间:2015-10-06 07:59:03

标签: rspec

在替换原始模拟方法之前,有没有办法在每个期望中模拟一次方法一次?

我认为这样的事情会起作用(注意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,我原本预计会失败。

我想知道如何按照期望一次嘲笑一次。

1 个答案:

答案 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;

}