rspec: 如何测试 ssh.scp

rspec: how to test ssh.scp

我尝试使用 rspec.

测试以下 ruby 代码
begin
Net::SSH.start(server_ip, server_username, :password => server_password) do |ssh|
    ssh.scp.upload!(local_file, remote_file)
    ssh.exec!("some command")
    ... more ssh.exec!
end
rescue
    puts "Failed to SSH"
end

我的 rspec 看起来像:

ssh_mock = double

expect(SSH).to receive(:start).and_yield(ssh_mock)
expect(ssh_mock).to receive(:scp)
expect(ssh_mock).to receive(:exec!).with("some command")

问题是测试永远不会通过,因为当它到达 scp 时它会跳转救援并且 scp.upload 从未正确测试过。

那么,有没有一种方法可以在以类似于此示例的方式调用时测试 scp.upload?

到目前为止,我能够测试 SCP 的唯一方法是有一个单独的块。 exp

Net::SCP.start(server_ip, server_username, :password => server_password) do |scp|
    scp.upload!(local_file, remote_file)
end

但是我可以测试它而不必像第一个示例那样将 SCP 与 SSH 分开吗?

我相信你也应该模拟从 ssh.scp 返回的 scp,像这样:

ssh_mock = double
scp_mock = double('scp')

expect(SSH).to receive(:start).and_yield(ssh_mock)
expect(ssh_mock).to receive(:scp).and_return(scp_mock)
expect(scp_mock).to receive(:upload!).with(local_file, remote_file)
expect(ssh_mock).to receive(:exec!).with("some command")