ruby-on-rails - RSpec: stub 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?
    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() 中的“黑匣子”返回文件流。

其次,我怎样才能正确地 stub sftp.file.open() 来完成这个?

在此先感谢您的任何想法!

最佳答案

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

  • 您不是在编写 sftp 测试,而是专注于测试您设置的内容
    出来测试。
  • 您在测试中消除了对网络的任何依赖 - 您不希望测试因为某些无法控制的事情而开始失败。

  • 就错误而言,这是您的直接问题:
    @entry_mock.stub(:name).with("filename").and_return("filename")
    

    在这里你 stub entry.name("filename")而不仅仅是 entry.name .

    将其更改为:
    @entry_mock.stub(:name).and_return("filename")
    

    让我知道你的进展如何。

    关于ruby-on-rails - RSpec: stub SFTP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11731626/

    相关文章:

    ruby-on-rails - rails 如果 object.nil?那么魔术 '' 在意见?

    ruby-on-rails - Rspec:测试实例变量的赋值

    ruby-on-rails - 对生成的文本编写测试

    ruby-on-rails - 如何测试 Controller 规范中的 strong_parameters?

    java - Mockito "when"的可能性

    ruby - RSpec-尝试 stub 返回自己参数的方法

    Swift 如何对具有依赖关系的函数进行单元测试

    ruby-on-rails - 如何在 Ruby 中选择 JSON 元素

    ruby-on-rails - 无法在控制台中保存记录

    ruby-on-rails - 如何从外部访问 Ruby on Rails 应用程序的数据?