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")
我尝试使用 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")