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|
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!
source share