Testowanie aplikacji korzystającej z serwisów zewnętrznych

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.