Ruby on rails RSpec:存根SFTP

Ruby on rails RSpec:存根SFTP,ruby-on-rails,rspec,stubbing,net-sftp,Ruby On Rails,Rspec,Stubbing,Net 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? fil

我正试图从对象中删除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
这是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:
首先,我的方法就在这里吗?我想删除SFTP的功能,因为我们可以确信它经过了很好的测试。相反,我想重点确保文件流由get_file_stream()中的“黑盒”返回

其次,如何正确地将sftp.file.open()存根以完成此任务


在此提前感谢您的任何想法

首先模拟sftp是个好主意,原因有两个:

  • 您没有编写sftp测试,只需测试您设置的内容即可 出去测试
  • 您可以在测试中删除对网络的任何依赖性—您不希望测试因为您无法控制的原因而开始失败
  • 就错误而言,这是您当前的问题:

    @entry_mock.stub(:name).with("filename").and_return("filename")
    
    这里您正在存根
    entry.name(“filename”)
    而不仅仅是
    entry.name

    将其更改为:

    @entry_mock.stub(:name).and_return("filename")
    
    让我知道你进展如何