2016-08-16 3 views
0

Ich versuche, rspec zu schreiben, um ssh Verbindung zu testen. In meiner Spezifikationsdatei, obwohl ich falsches Serverpasswort eingegeben habe, sagt es immer noch 0 examples, 0 failures. Kann mir jemand erklären, warum ich das sehe, während ich erwartet werde, mindestens eine Fehlermeldung zu sehen.Rspec für ssh Verbindung

Unten ist das Stück Code meiner ssh_host.rb und ssh_host_spec.rb files.

require "java" 
require "highline/import" 
require 'open-uri' 
require 'socket' 
require 'rubygems' 
require 'net/ssh' 
require 'stringio' 
require 'net/scp' 
require 'colorize' 

module SshMod 

class SshHost 

    attr_accessor :hostname, :username, :password 

    def initialize(host, user, password) 
      @hostname = host 
      @username = user 
      @password = password 

      @ssh = Net::SSH.start(@hostname, @username, :password => @password) 
      puts "\t Connection established for #{@hostname}...".blue 
    end 
end 
end 

Rspec Klasse:

#!/usr/bin/env rspec 

require 'spec_helper' 
require 'ssh_host.rb' 

describe SshMod::SshHost do 
    before :each do 
     @ssh = SshMod::SshHost.new "servername", "user", "wrong_password" 

    end 
end 

describe "#new" do 
    it "takes three parameters and returns sshhostobject" do 
     @ssh.should_be_an_instance_of SshHost 

    end 
end 

ssh_mock = double() 


expect(SSH).to receive(:start).and_return(ssh_mock) 

Antwort

2

Es gibt eine Reihe von Dingen falsch mit Spec-Datei. Ihr Test für new sollte im Kontext Ihrer SshMod::SshHost Beschreibung sein, andernfalls hat er keinen Zugriff auf die ssh-Instanzvariable. Außerdem sollte Ihr Code einige Fehler verursachen, da except nicht im Kernel definiert ist, sondern im Kontext eines Rspec-Objekts liegt. Sie möchten es wahrscheinlich in Ihre before setzen.

In Bezug auf Ihre Anforderungen in Ihrer Ruby-Klasse, würde ich alles loswerden, was Sie nicht brauchen (zum Beispiel, warum die explizite Aufnahme von Socket bei der Verwendung von Net-SSH?).

Ich glaube jedoch, dass Sie auf das Problem stoßen, wo wahrscheinlich Tests aufgrund Ihrer Projektstruktur nicht ausgeführt werden (aber das ist nur eine Vermutung, da Sie es nicht aufgelistet haben). Rspec sucht standardmäßig nach Spezifikationsdateien, die unter spec/**/*_spec.rb aufgelistet sind und die Sie mit dem Flag --pattern überschreiben können. Weitere Informationen finden Sie unter rspec --help.

Hier ist ein Arbeitsbeispiel für Ihren Code mit einer Reihe von Dingen aufgeräumt. Ich stelle die Quelle Ihres Codes in lib, vorausgesetzt, Sie machen so etwas wie ein Juwel.


Gemfile:

source "https://rubygems.org" 

gem "colorize" 
gem "rspec" 
gem "net-ssh" 

lib/ssh_host.rb

require 'net/ssh' 
require 'colorize' 

module SshMod 
    class SshHost 
    attr_accessor :hostname, :username, :password 

    def initialize(host, user, password) 
     @hostname = host 
     @username = user 
     @password = password 

     @ssh = Net::SSH.start(@hostname, @username, password: @password) 
     puts "\t Connection established for #{@hostname}...".blue 
    end 
    end 
end 

spec/spec_helper.rb

$:.unshift File.join(File.dirname(__FILE__), '..', 'lib') 
require 'rspec' 

RSpec.configure do |config| 
    config.mock_with :rspec do |mocks| 
    mocks.verify_partial_doubles = true 
    end 
end 

spec/ssh_host_spec.rb

0.123.
require 'spec_helper' 

require 'ssh_host' 

describe SshMod::SshHost do 
    let (:ssh) { SshMod::SshHost.new "servername", "user", "wrong_password" } 
    before :each do 
    allow(Net::SSH).to receive(:start).and_return(double("connection")) 
    end 

    describe "#new" do 
    it "takes three parameters and returns sshhostobject" do 
     expect(ssh).to be_a SshMod::SshHost 
    end 
    end 
end