Rspec net-ssh会抛出NoMethodError

时间:2013-12-18 00:37:01

标签: ruby rspec net-ssh

我有一个运行ssh会话的ruby脚本(scratch / ssh.rb):

require 'net/ssh'
require 'net/ssh/shell'

def try_process
    Net::SSH.start('host', 'username', {:password=>'pwd'}) do |ssh|
    end
end

我写了一个规范(spec / test_ssh.rb)如下:

require 'scratch/ssh'

describe 'SSH Tester' do
  it "should work" do
    try_process
  end
end

我尝试按如下方式运行规范:

bundle exec rspec -I. spec/test_ssh.rb

得到以下结果:

Failures:

  1) SSH Tester should work
     Failure/Error: try_process
     NoMethodError:
       undefined method `timeout' for #<Net::SSH::Transport::Session:0x000000036d5288>
     # ./scratch/ssh.rb:6:in `try_process'
     # ./spec/test_ssh.rb:5:in `block (2 levels) in <top (required)>'

有趣的是,运行ssh.rb本身就成功了,所以我认为它与RSpec有关。

我试图查找net-ssh源代码并发现here它确实使用了'timeout',这似乎是一个合法的Ruby模块。

我怀疑这可能是因为rspec使用不同的/ cut版本的Ruby解释器来运行测试,但我不知道如何检查它。我在规范中试图put LOAD_PATH,但它没有表现出任何可疑之处。

Ruby版本:1.9.3 Rspec版本:2.14.7 net-ssh版本:2.1.4

有没有人知道我需要挖掘哪些来解决这个问题?

非常感谢!

1 个答案:

答案 0 :(得分:0)

为了它的价值,我试图重现你的问题,但却无法。

具体来说,以下代码:

require 'net/ssh'
require 'net/ssh/shell'

def try_process
    Net::SSH.start('123.123.123.123', {}) do |ssh|
    end
end

describe "" do
  it "" do
    try_process
  end
end

产生了以下输出:

F

Failures:

  1)  
     Failure/Error: Net::SSH.start('123.123.123.123', {}) do |ssh|
     Errno::ETIMEDOUT:
       Operation timed out - connect(2)
     # ./tmp/so_spec.rb:5:in `try_process'
     # ./tmp/so_spec.rb:11:in `block (2 levels) in <top (required)>'

Finished in 1 minute 15.69 seconds
1 example, 1 failure

Failed examples:

rspec ./tmp/so_spec.rb:10 #

表示timeout方法仍可在RSpec块中访问。

此测试使用Ruby 2.0.0p247和RSpec 2.14.5

完成