2012-10-02 6 views
8

Ich schreibe einen Test für unsere App, und ich habe angularjs-mocks.js enthalten, so dass ich die netten dsl-Funktionen nutzen kann, die mit ihm kommen.Verwendung von angularjs Mocks ohne tatsächlich etwas zu spotten

Aber ich möchte nicht wirklich die $ http Anfragen verspotten, da ich diese App mit einem Kunden-Backend integriere, das ständig im Fluss ist, und ich möchte gegen echte Antworten testen.

Was ist die beste (einfachste) Möglichkeit, das echte http-Backend in dieser Situation zu verwenden?

EDIT:

ich eine mögliche Lösung gefunden haben, die diese zu verwenden ist:

$httpBackend.whenPOST(/.*/).passThrough() 

Aber wie ich weiter unten erwähnt, ist es nicht funktioniert, möglicherweise defekt? Ich bekomme diese Fehlermeldung:

Error: Unexpected request: POST /some/url/here No more request expected 

ich ein Problem hier geöffnet haben: https://github.com/angular/angular.js/issues/1434

+0

Sie könnten immer ein Mock $ http zu injizieren, indem Sie ein einfaches Javascript erstellen, das die XHR http Anfrage, keine Winkel Mocks notwendig war. Es ist das Schöne daran, in JavaScript zu testen. Sie können Objekte zusammenfassen und sie durch dynamisches Tippen injizieren, wie es Ihnen gefällt. –

+0

Richtig, aber das Problem ist, dass anglemocks $ httpBackend überschreibt, was $ http verwendet. Ich versuche jetzt, es mit $ httpBackend.whenGET (/.*/) umgehen. PassThrough(), aber das scheint entweder gebrochen, oder ich verwende es nicht richtig. – doubledriscoll

+0

Ich vermute, was ich vorschlage, ist, dass Sie vanilla js verwenden können, um ein Objekt mit allen notwendigen Methoden zu erstellen. Kein eckiger Schein erforderlich. –

Antwort

2

ich eine schnelle und schmutzige Lösung des Problems herausgefunden: die Linie kommentierte, wo $ httpBackend außer Kraft gesetzt wird (1365 in Winkel -mocks-1.0.2.js).

angular.module('ngMock', ['ng']).provider({ 
    $browser: angular.mock.$BrowserProvider, 
    $exceptionHandler: angular.mock.$ExceptionHandlerProvider, 
    $log: angular.mock.$LogProvider, 
    //$httpBackend: angular.mock.$HttpBackendProvider, 
    $rootElement: angular.mock.$RootElementProvider 
}).config(function($provide) { 
    $provide.decorator('$timeout', function($delegate, $browser) { 
    $delegate.flush = function() { 
     $browser.defer.flush(); 
    }; 
    return $delegate; 
    }); 
}); 

Dies ist wahrscheinlich bricht etwas anderes, aber es lässt mich testen, was ich testen müssen, und nicht die Produktion App beeinflussen, es ist so in Ordnung mit mir. Hoffentlich wird es in Zukunft einen eingebauten Weg dafür geben.

+0

Das ist ziemlich hässlich. Es ist traurig, dass es keinen besseren Weg gibt. – stej

Verwandte Themen