RSpec: заглушка SFTP
Я пытаюсь заглушить Net::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
Вот спецификация:
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
Вот трассировка стека:
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:
Прежде всего, мой подход прямо здесь? Я хочу удалить функциональность SFTP, так как мы можем быть уверены, что он довольно хорошо протестирован. Вместо этого я хочу сосредоточиться на том, чтобы поток файлов возвращался "черным ящиком" внутри get_file_stream().
Во-вторых, как я могу правильно заглушить sftp.file.open() для этого?
Заранее спасибо за любые идеи здесь!
1 ответ
Решение
Во-первых, отключение sftp - хорошая идея по двум причинам:
- Вы не пишете тест sftp, сосредоточьтесь на тестировании только того, что вы намеревались протестировать.
- Вы удаляете любую зависимость от сети в своих тестах - вы не хотите, чтобы тесты начинали давать сбой из-за чего-то вне вашего контроля.
Что касается ошибки, это ваша непосредственная проблема:
@entry_mock.stub(:name).with("filename").and_return("filename")
Здесь ты окаменел entry.name("filename")
а не просто entry.name
,
Измените это на:
@entry_mock.stub(:name).and_return("filename")
и дай мне знать, как ты поживаешь.