rspec:如何测试ssh.scp

时间:2015-03-24 07:07:54

标签: ruby rspec net-ssh

我有以下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分开的情况下对其进行测试吗?

1 个答案:

答案 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")