2011-10-24 17 views
6

Teraz dzwonię do usługi WWW innej firmy w ramach mojej aplikacji. Używam klejnotu RestClient, aby to zrobić. Istnieje mnóstwo narzędzi do zrobienia tego samego, więc to nie powinno mieć znaczenia.Ruby on Rails: najlepszy sposób na przetestowanie nieudanego połączenia z interfejsem API innej firmy.

Ciekawe jest to, że mam wystarczająco dobre testy, nic nadzwyczajnego, w którym mogę zasymulować reakcję mojej aplikacji, gdy usługa internetowa strony trzeciej jest niedostępna z jakiegokolwiek powodu. Być może przekroczyłem limit szybkości lub limit czasu z powodu opóźnień sieci/komplikacji, po prostu chcę mieć coś takiego jak kod statusu HTTP i przetestować, co robi moja aplikacja w tym przypadku.

Jaki jest najlepszy sposób na zrobienie tego przy pomocy Test :: Unit? Teraz połączenie z usługą innej firmy jest zamknięte wewnątrz jednego z moich kontrolerów. Mam prosty moduł z niektórymi metodami otoki dla różnych punktów końcowych usługi zdalnej. Chcę tylko upewnić się, że moja aplikacja robi właściwe rzeczy, gdy usługa jest lub nie jest dostępna.

Czy stosuje się dodatkowe ramy obok Test :: Unit, które mogą "wkręcić" w odpowiedni sposób, aby to zrobić? Oczywiście nie mogę wymuszać przekroczenia czasu w sieci i zaczynanie hackowania z takimi rzeczami jak IPtables tylko dla testów nie jest warte czasu. Jestem pewien, że problem ten został rozwiązany milion razy, ponieważ integrowanie takich rzeczy jak Facebook i Twitter w aplikacjach internetowych jest tak popularne w dzisiejszych czasach. W jaki sposób testujesz na wypadek niepowodzenia podczas korzystania z tych interfejsów API w solidnym/kontrolowanym formacie?

Odpowiedz

5

Polecam używając czegoś takiego jak webmock, aby pozorować wszystkie swoich żądań http (nie tylko po to, żeby sfałszować nieudane żądanie); znacznie przyspieszy to Twój pakiet testowy, zamiast zmuszać go do korzystania z usługi osoby trzeciej za każdym razem, gdy przeprowadzisz testy.

Webmock obsługuje Rest Client i Test :: Unit. Wystarczy umieścić ten kod w pliku test/test_helper.rb:

require 'webmock/test_unit' 

Jako przykład, aby przetestować timeout sieciowy:

stub_request(:any, 'www.example.net').to_timeout 
RestClient.post('www.example.net', 'abc') # ===> RestClient::RequestTimeout 
1

railscast: 291 (tylko abonent) opowiada o testach z magnetowidu i RSpec (wiem, nie to nie jest test: Unit)

zresztą można zajrzeć do korzystania VCR dla tego typu rzeczy

Powiązane problemy