【问题标题】:How do I stub/mock a call to the command line with rspec?如何使用 rspec 存根/模拟对命令行的调用?
【发布时间】:2009-11-10 15:09:44
【问题描述】:

我正在尝试测试命令行工具的输出。如何使用 rspec 来“伪造”命令行调用?执行以下操作无效:

it "should call the command line and return 'text'" do
  @p = Pig.new
  @p.should_receive(:run).with('my_command_line_tool_call').and_return('result text')
end

如何创建存根?

【问题讨论】:

  • 我们能看到Pig类的相关部分吗?
  • this(没用过)

标签: ruby command-line rspec


【解决方案1】:

使用new message expectation syntax

spec/dummy_spec.rb

require "dummy"

describe Dummy do
  it "command_line should call ls" do
    d = Dummy.new
    expect(d).to receive(:system).with("ls")
    d.command_line
  end
end

lib/dummy.rb

class Dummy
  def command_line
    system("ls")
  end
end

【讨论】:

    【解决方案2】:

    这是我制作的一个简单示例。我从我的虚拟班级中调用 ls。用 rspec 测试

    require "rubygems"
    require "spec"
    
    class Dummy
      def command_line
        system("ls")
      end
    end
    
    describe Dummy do
      it  "command_line should call ls" do
        d = Dummy.new
        d.should_receive("system").with("ls")
        d.command_line
      end
    end
    

    【讨论】:

    • 我认为我还有一些其他令人望而却步的错误,这些错误甚至没有进入运行/系统调用。
    • 这是如何存根或模拟系统调用的?
    【解决方案3】:

    或者,您可以重新定义内核系统方法:

    module Kernel
      def system(cmd)
        "call #{cmd}"
      end
    end
    
    > system("test")
    => "call test" 
    

    感谢这个问题:Mock system call in ruby

    【讨论】:

    • 为什么这个答案会受到如此多的反对? @jpatokal 所指的答案有 17 个赞!
    • 大概是因为它不是存根/模拟,而是实际上替换该方法。再说一次,你想在测试中进行实际的系统调用吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    相关资源
    最近更新 更多