你如何在Rspec中模拟/存根系统调用?

per*_*nce 9 ruby rspec

我有一个使用反引号的方法,但存根不适用它.它拉动了ls的结果:

class TestHelper
  def self.test_method
    `ls`
  end
end
Run Code Online (Sandbox Code Playgroud)

rspec测试:

describe TestHelper do
  describe '.test_method' do
    subject { described_class.test_method }
    before { Kernel.stub(:`).and_return("test_dir") }
    it { expect(subject).to eql("test_dir") } 
  end
end
Run Code Online (Sandbox Code Playgroud)

Ram*_*yag 10

TestHelper收到它,然后委托给Kernel.所以,存根TestHelper:

describe TestHelper do
  describe '.test_method' do
    subject { described_class.test_method }
    before { allow(described_class).to receive(:`).and_return("test_dir") }
    it { is_expected.to eql("test_dir") } 
  end
end
Run Code Online (Sandbox Code Playgroud)


小智 3

包装ls一个方法,然后将该方法存根掉。

def ls
  `ls`
end
Run Code Online (Sandbox Code Playgroud)

存根此方法以返回您想要的任何内容。您不需要测试系统调用。