2012-07-31 23 views
6

Tôi đang cố gắng loại bỏ Net :: SFTP từ một đối tượng. Dưới đây là mô hình:RSpec: Đặt 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 

Dưới đây là 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 

Đây là 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: 

Trước hết, là cách tiếp cận của tôi ngay tại đây? Tôi muốn loại bỏ chức năng của SFTP vì chúng tôi có thể tự tin rằng nó được kiểm tra khá tốt. Thay vào đó, tôi muốn tập trung vào việc đảm bảo rằng luồng tệp được trả về bởi "hộp đen" bên trong get_file_stream().

Thứ hai, làm thế nào tôi có thể phân tích chính xác sftp.file.open() để thực hiện việc này?

Cảm ơn trước về mọi ý tưởng tại đây!

Trả lời

7

Thứ nhất mocking ra sftp là một ý tưởng tốt vì hai lý do:

  1. Bạn không viết một bài kiểm tra sftp, tập trung vào thử nghiệm chỉ là những gì bạn thiết lập ra để kiểm tra.
  2. Bạn loại bỏ bất kỳ sự phụ thuộc nào trên mạng trong các thử nghiệm của mình - bạn không muốn các thử nghiệm bắt đầu thất bại vì một điều gì đó ngoài tầm kiểm soát của bạn.

Theo như lỗi đi, đây là vấn đề trước mắt của bạn:

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

Tại đây bạn sẽ stubbing entry.name("filename") thay vì chỉ entry.name.

Thay đổi nó để:

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

và cho tôi biết làm thế nào bạn nhận được trên.

+0

@cheesewasel - làm việc như một sự quyến rũ! Cảm ơn đã giúp đỡ! – Sly

+0

Không sao cả. :) –