2016-06-10 14 views
1

Ich pflege eine Web-API in Ruby geschrieben. Es verbindet sich mit vielen Webdiensten von Drittanbietern. Beim Schreiben von Tests stubele ich jede Funktion, die eine Verbindung zum Netzwerk herstellen und stattdessen abgefüllte Daten zurückgeben müsste.Kann verhindert werden, dass eine Ruby-Instanz die Netzwerkverbindung öffnet?

Es ist mir schon passiert, dass ich diesen Stubbing-Schritt vergesse und meine Integrationstests tatsächlich mit einem Drittanbieter-Dienst verbunden werden.

In diesem Sinne möchte ich verhindern, dass Ruby Netzwerkverbindungen öffnen kann. Wenn es versucht wird, möchte ich stattdessen eine Ausnahme auslösen, die darauf hinweist, welche Funktion ich vergessen habe.

Ist das möglich? Welche zentrale Ruby-Funktion müsste ich überschreiben, um dies mit minimalen anderen Nebenwirkungen zu erreichen?

Antwort

1

Was ist mit WebMock? Hast Du es versucht? https://github.com/bblimke/webmock

sollten Diese Linie helfen:

WebMock.disable_net_connect!(allow_localhost: true) 
+0

Leider scheint dies nur HTTP-Verbindungen zu deaktivieren ... Bibliotheken wie [ruby-ldap] (https://github.com/ruby-ldap/ruby-net-ldap) dürfen sich weiterhin über TCP-Verbindungen verbinden. – Hubro

1

Handbuch Anstoßen ist, wie Sie gerade gesagt haben, unzuverlässig.

Eine bessere Lösung könnte sein, Ihren Code, der externe Services hinter einer Fassade aufruft, zu verpacken und die Abhängigkeitsinjektion zu verwenden, um den Web-Handling-Service bei der Erstellung an die Fassade zu übergeben. Ihre Test Suite muss dann dasselbe mit einem Stub-Service tun. Sie müssten dies nur einmal tun, und jeder Test, bei dem dann externer Code getestet wurde, würde den Stubbed-Dienst verwenden.

+0

Guter Rat im Allgemeinen, denke ich, aber es hilft mir jetzt nicht viel. Ich möchte nicht meine gesamte Codebasis umgestalten, ich möchte nur sicherstellen, dass Ruby beim Ausführen von Unit-Tests keine Netzwerk-Sockets öffnen kann. – Hubro

+0

Wenn es nötig wäre, die gesamte Codebasis umzuformen, gibt es ein grundlegendes Problem mit der Codebasis und es muss wahrscheinlich refactoring werden. Ihre Verwendung von HTTP sollte zu einer einzigen Methode zusammengefasst werden, bei der es leicht ist, zu mocksen/umzuleiten/zu unterwandern. –

+0

@theTinMan Wie ich schon sagte, es ist nur HTTP Ich spreche über alle Verbindungen mit dem Netzwerk einschließlich der grundlegenden TCP/UDP-Verbindungen. – Hubro

0

Auschecken VCR.

Zuerst sehen Sie sich its documentation an und sehen, ob es das ist, was Sie brauchen, was ich vermute. Wir verwenden es in meiner Firma seit ein paar Jahren, um einen HTTP-Test für eine Spezifikation aufzuzeichnen und die Ergebnisse für nachfolgende Tests wiederzugeben.

Wir haben festgestellt, dass es im Umgang mit externen APIs von unschätzbarem Wert ist.

Verwandte Themen