对产生控制的方法进行Rspec测试

时间:2014-12-17 14:15:58

标签: ruby testing rspec yield

我目前正在为已编写的项目代码编写rspec测试。 我试图测试的代码如下:

def foo (ip, user)
    #[...]
    result = ""
    Net::SSH.start(ip, user) do |session|
        result = session.exec!('some_command_in_linux')
    end
    #[...]
end

我想要完成的是通过SSH将结果的分配与远程命令的执行分配,从而将假字符串分配给结果变量。

我已阅读 yield matchers ,但尚未成功将其应用于我的方案。

更具体地说,我在想:

expect {|block| Net::SSH::start(ip, user, &block).to receive(ip, user, &block).and_return(sample_output)}

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果您不需要阻止实际运行 - 只需忽略它。它不会运行,但它会被安全地忽略:

expect(Net::SSH).to receive(:start).with(ip, user).and_return(sample_output)

如果你希望块运行,请使用and_yield

session = double(:session).as_null_object
expect(Net::SSH).to receive(:start).with(ip, user).and_yield(session).and_return(sample_output)

如果您希望session对象以某种方式运行,您可以expect来执行操作:

session = double(:session)
expect(Net::SSH).to receive(:start).with(ip, user).and_yield(session)
expect(session).to receive(:exec!).with('some_command_in_linux').and_return(sample_output)