2014-10-31 1 views
2

Я пытаюсь проверить, что я в состоянии захватить эти исключения AWS:Rspec - Как окурок исключение 3-й партии

begin 
    s3_client = S3Client.new 
    s3_file = s3_client.write_s3_file(bucket, file_name, file_contents) 
rescue AWS::Errors::ServerError, AWS::Errors::ClientError => e 
    # do something 
end 

Мой Rspec 3 Код:

expect_any_instance_of(S3Client).to receive(:write_s3_file).and_raise(AWS::Errors::ServerError) 

Но когда Я проверить этот окурок, я получаю TypeError:

exception class/object expected 

должен ли я включить AWS :: Ошибки :: ServerError? Если да, то как мне это сделать? Я использую жемчужину aws-sdk-v1.

Спасибо.

+0

В какой строке вы получаете 'TypeError'? –

+0

../gems/rspec-mocks-3.1.3/lib/rspec/mocks/message_expectation.rb:194 – Slowfib

+0

Ваш код кажется мне хорошим. Единственное, что у меня есть, это необходимость в библиотеках стеков s3client и AWS. Просто для эксперимента попробуйте заменить S3Client любым классом, который знает по умолчанию (любая модель, например), и AWS :: Errors ... по стандартуError и запускает ваш тест. – Alexander

ответ

0

Я бы построил в порт, а затем впрыснул объект, который только что умирает, чтобы дать вам ошибку. Поясню:

class ImgService 
    def set_client(client=S3Client.new) 
    @client = client 
    end 

    def client 
    @client ||= S3Client.new 
    end 

    def write(bucket, file_name, file_contents) 
    begin 
     @client.write_s3_file(bucket, file_name, file_contents) 
    rescue AWS::Errors::ServerError, AWS::Errors::ClientError => e 
     # do something 
    end 
    end 
end 

тест:

describe "rescuing an AWS::Error" do 
    before :each do 
    @fake_client = double("fake client") 
    allow(@fake_client).to receive(:write_s3_file).and_raise(AWS::Errors::ServerError) 

    @img_service = ImgService.new 
    @img_service.set_client(@fake_client) 
    end 
    # ... 
end