RSpec: Stubbing SFTP

I am trying to disconnect Net :: SFTP from an object. Here is the model:

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 

Here spec:

 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 

Here's the 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: 

First of all, is this my approach right here? I want to remove SFTP functionality, as we can be sure that it is pretty well tested. Instead, I want to focus on getting the file stream returned as a black box inside get_file_stream ().

Secondly, how can I execute sftp.file.open () correctly to execute this?

Thanks in advance for any ideas!

+6
source share
1 answer

Firstly, bullying sftp is a good idea for two reasons:

  • You do not write the sftp test, focus on testing only what you set to check.
  • You remove any network dependency in your tests β€” you don’t want the tests to run with an error due to something out of your control.

As for the error, this is your immediate problem:

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

Here you truncate entry.name("filename") , not just entry.name .

Change it to:

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

and let me know how you do it.

+7
source

Source: https://habr.com/ru/post/921727/


All Articles