2012-07-31 17 views
6

Ich versuche, Net :: SFTP von einem Objekt auszuschließen. Hier ist das Modell:RSpec: Stubbing SFTP

class BatchTask 
    require 'net/sftp' 

    def get_file_stream(host, username, password, path_to_dir, filename) 
    raise ArgumentError if host.nil? or username.nil? or password.nil? or path_to_dir.nil? or filename.nil? 
    file_stream = nil 
    Net::SFTP.start(host, username, password) do |sftp| 
     sftp.dir.glob(path_to_dir, filename) do |entry| 
     # Verify the directory contents 
     raise RuntimeError(true), "file: #{path_to_dir}/#{filename} not found on SFTP server" if entry.nil? 
     file_stream = sftp.file.open("#{path_to_dir}/#{entry.name}") 
     end 
    end 
    file_stream 
    end 

end 

Hier ist die Spezifikation:

require 'spec_helper' 

describe "SftpToServer" do 
    let(:ftp) { BatchTask::SftpToServer.new } 

it "should return a file stream" do 
    @sftp_mock = mock('sftp') 
    @entry = File.stubs(:reads).with("filename").returns(@file) 
    @entry_mock = mock('entry') 
    @entry_mock.stub(:name).with("filename").and_return("filename") 
    @sftp_mock.stub_chain(:dir, :glob).and_yield(@entry_mock) 
    Net::SFTP.stub(:start).and_yield(@sftp_mock) 
    @sftp_mock.stub_chain(:file, :open).with("filename").and_yield(@file) 

    ftp.get_file_stream("ftp.test.com", "user", "password", "some/pathname", "filename").should be_kind_of(IO) 
    end 

end 

Hier ist der Stacktrace:

Spec::Mocks::MockExpectationError in 'SftpToServer should return a file stream' 
Mock "entry" received :name with unexpected arguments 
    expected: ("filename") 
     got: (no args) 
/Users/app/models/batch_task/sftp_to_server.rb:12:in `get_file_stream' 
/Users/app/models/batch_task/sftp_to_server.rb:9:in `get_file_stream' 
/Users/app/models/batch_task/sftp_to_server.rb:8:in `get_file_stream' 
./spec/models/batch_task/sftp_to_server_spec.rb:15: 

Zunächst einmal mein Ansatz ist hier richtig? Ich möchte die Funktionalität von SFTP entfernen, da wir sicher sein können, dass es ziemlich gut getestet ist. Stattdessen möchte ich sicherstellen, dass ein Dateistrom von der "Black Box" in get_file_stream() zurückgegeben wird.

Zweitens, wie kann ich sftp.file.open() ordnungsgemäß ausstoßen, um dies zu erreichen?

Vielen Dank im Voraus für Ideen hier!

Antwort

7

Zum einen SFTP spöttisch aus eine gute Idee, aus zwei Gründen:

  1. Sie sind nicht SFTP-Test, den Schwerpunkt auf die Prüfung zu schreiben, was Sie , um Test-Set.
  2. Sie entfernen alle Abhängigkeiten vom Netzwerk in Ihren Tests - Sie möchten nicht, dass Tests aufgrund von etwas außerhalb Ihrer Kontrolle fehlschlagen.

Soweit der Fehler geht, ist dies Ihr unmittelbares Problem:

@entry_mock.stub(:name).with("filename").and_return("filename") 

Hier sind Sie entry.name("filename") anstatt nur entry.name Anstoßen.

Ändern Sie es an:

@entry_mock.stub(:name).and_return("filename") 

und lassen Sie mich wissen, wie Sie auf bekommen.

+0

@cheesewasel - arbeitete wie ein Charme! Danke für die Hilfe! – Sly

+0

Kein Problem. :) –