2016-11-23 18 views
5

Więc w moim kodu mam tej metody próbuję testu:rspec - niewłaściwa liczba argumentów podczas podnoszenia błąd

# 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 

Teraz próbuję zrobić dwa przypadki testowe - jeden dla kiedy istnieje plik i jeden, gdy nie.

Skoncentrowanie się na przypadku awarii. Chcę wykasować exists?, aby podnieść błąd Aws::S3::Errors::Forbidden, aby metoda file_exists? zwróciła wartość false.

Oto co mój kod testowy wygląda następująco:

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 

Uruchomienie tego testu widzę to:

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

naprawdę nie wiadomo, co się tu dzieje, ponieważ metoda file_exists? pewno nie ma arytet 2, ani też nie jestem obciążony metodą exists?.

Aby zdiagnozować to, umieściłem punkt przerwania w bloku begin. Próbuję uruchomić linię <object>.exists? i uzyskać ten sam błąd.

Odpowiedz

10

Okazuje się, że problem był z:

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

Running to pokazuje ten sam błąd:

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

Co działa to:

raise(Aws::S3::Errors::Forbidden.new(nil, nil)) 
Powiązane problemy