[rspec-users] Mocking Net::SSH connections

Jamie D jam5t3r.lists at gmail.com
Mon Apr 21 17:22:40 EDT 2008


Thanks for the info Aslak, I have rewritten my code like you suggest
but have one issue with raising an exception. When I try the code in
the console an exception is raised correctly but in my test code I get
a message "command did not return expected result"

# test
describe Ssh, "Remote" do

  before(:each) do
    @ssh = mock(Net::SSH)
    @response = mock(Net::SSH)
    @connection = Ssh::Remote.new
    @connection.should_receive(:start).with('server', 'root').and_return(@ssh)
    @connection.should_receive(:close)
    @ssh.should_receive(:send_command).with('ls /').and_return(@response)
    @response.should_receive(:stdout).and_return('a list')
  end

  it "should raise exception if response does not match expected" do
    @connection.remote_command('server', 'root', [{:command => 'ls /',
:expects => /blah/}]).
      should raise_error(Ssh::CommandError, 'command did not return
expected result')
  end

end

# code exception.rb
module Ssh
  class CommandError < Exception
  end
end

# ssh.rb
require 'net/ssh'
require 'ssh/exception'

module Ssh
  class Remote

    def remote_command(server, user, commands=[])
      shell = start(server, user)
      commands.each do |command|
        out = shell.send_command command[:command]
        unless out.stdout =~ command[:expects] or command[:expects].blank?
          close
          raise(CommandError.new, 'command did not return expected result')
        end
      end
      close
      return true
    end

    def start(server, user)
      @session = Net::SSH.start(server, user)
      @session.shell.sync
    end

    def close()
      @session.close
    end

  end
end

Thanks
Jamie


More information about the rspec-users mailing list