2016-11-23 5 views
5

Таким образом, в моем коде у меня есть этот метод, который я пытаюсь проверить:Rspec - неверное число аргументов при повышении ошибки

# checks if a file already exists on S3 
    def file_exists?(storage_key) 
    begin 
     s3_resource.bucket(@bucket).object(storage_key).exists? 
    rescue Aws::S3::Errors::Forbidden => e 
     false 
    end 
    end 

Теперь я пытаюсь сделать два тестовых случай - один, когда файл существует , а другой - когда нет.

Фокусировка на случае отказа. Я хочу заглушить exists?, чтобы поднять ошибку Aws::S3::Errors::Forbidden, чтобы метод file_exists? вернул значение false.

Вот что мой тестовый код выглядит следующим образом:

it "returns false if the file doesn't already exist" do 
    allow_any_instance_of(Aws::S3::Object).to receive(:exists?).and_raise(
     Aws::S3::Errors::Forbidden 
    ) 
    expect(instance.file_exists?('foo')).to be false 
    end 

Выполнение этого теста я вижу это:

wrong number of arguments (given 0, expected 2) 
    # ./lib/s3_client_builder.rb:48:in `file_exists?' 

На самом деле не ясно, что происходит здесь, так как метод file_exists? определенно не имеет arity of 2 и не делает метод exists?, которым я занимаюсь.

Чтобы диагностировать это, я поставил точку останова в блоке begin. Я пытаюсь запустить строку <object>.exists? и получить ту же ошибку.

ответ

10

Оказывается, проблема была с:

and_raise(
    Aws::S3::Errors::Forbidden 
) 

Запуск это показывает ту же ошибку:

raise(Aws::S3::Errors::Forbidden) 

Что работы заключается в следующем:

raise(Aws::S3::Errors::Forbidden.new(nil, nil)) 
Смежные вопросы