我有以下ruby代码,我尝试使用rspec进行测试。
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分开的情况下对其进行测试吗?
答案 0 :(得分:1)
我相信你也应该嘲笑从scp
返回的ssh.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")