Cześć,
W jaki sposób testujecie aplikacje, jeżeli korzystają one z serwisów zewnętrznych (Bitly, MailChimp, Facebook itp.)?
Obecnie piszę appke, która wykorzystuję Bitly (skracanie linków) + Tokboxa (video-rozmowy po WebRTC). Do Bitly’ego, napisałem sobie prosty komponent, który na poziomie interfejsu jest zgodny z gemem Bitly. Następnie w configu rspeca podmieniam oryginalny komponent na swój:
stub_const("Bitly", FakeBitly.new)
FakeBitly ma dodatkowe metody w celu weryfikacji jakie linki były skracane (dla assertów w testach). Nie wiem czy jest to najlepszy sposób, ale wolałem to niż mockowanie requestów http i przekopywanie się przez dokumentację api Bitly’ego.
Jednak większy problem mam po stronie JavaScriptu (testy z użyciem RSpec + Capybara). W jaki sposób napisać test dla strony, która korzysta z Tokboxa (aby uruchomić video-czat)? Zastąpić bibliotekę Tokboxa jakimś swoim kodem, i sprawdzać czy odpowiednie metody były wywołane (mniej więcej tak jak to robię dla Bitly)? Czy może jest jakiś lepszy sposób?
Mockowanie requestów http jest teraz bardzo proste z użyciem gemów fakeweb czy vcr, a dodatkowo zapewnia ci że biblioteka od interfejsowania z tymi requestami nie wprowadziła nagle łamiącej zmiany.
Chociaż opcja ze stubowanymi klasami jest oczywiście bardziej “czysta” z punktu widzenia OOP bo pozwala lepiej odizolować konkretny test.
A próbowałeś capybara_discoball, gema stworzonego właśnie do takich sytuacji?
@Tomash dzięki za linka do Capybara discoball, nie znałem tego.
Problem z biblioteką od Tokboxa (chat) jest taki, że nie wiele mogę zrobić - po prostu podaję api, token i id sesji, a ona się automatycznie inicjalizuję sesje. W dużym uproszczeniu wygląda to tak:
<script src="//static.opentok.com/webrtc/v2.2/js/opentok.min.js" ></script>
<script type="text/javascript">
var apiKey = "YOUR API KEY HERE";
var sessionId = "YOUR SESSION ID HERE";
var token = "YOUR TOKEN HERE";
var session = OT.initSession(apiKey, sessionId);
session.on("streamCreated", function(event) {
session.subscribe(event.stream);
});
session.connect(token, function(error) {
var publisher = OT.initPublisher();
session.publish(publisher);
});
</script>
Dokumentacja nie opisuje (a przynajmniej mnie się nie udało znaleźć) procesu wymiany danych między klientem js a ich serwerami.