2012-10-02 14 views
8

Piszę test dla naszej aplikacji, a dołączyłem angularjs-mocks.js, dzięki czemu mogę korzystać z ładnych funkcji dsl, które są z tym związane.Używanie makr angularjs bez kpiny z niczego

Ale nie chcę kpić z żądań $ http, ponieważ integruję tę aplikację z backendem klienta, który nieustannie się zmienia i chcę przetestować na podstawie rzeczywistych odpowiedzi.

Jaki jest najlepszy (najłatwiejszy) sposób użycia prawdziwego backendu http w tej sytuacji?

EDIT:

znalazłem potencjalne rozwiązanie, które jest w użyciu to:

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

Ale jak wspominam poniżej, to nie działa, prawdopodobnie złamany? Otrzymuję ten błąd:

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

Mam otwarty problem tutaj: https://github.com/angular/angular.js/issues/1434

+0

Zawsze można utworzyć fałszywy $ http do wstrzyknięcia, tworząc prosty javascript, który wykonał żądanie http XHR, bez konieczności makiet kątowych. Fajnie jest testować w JavaScript, możesz klapsować obiekty i wstrzykiwać je, jak chcesz, z powodu dynamicznego pisania. –

+0

Dobrze, ale problem polega na tym, że angularmocks zastępuje $ httpBackend, którego używa $ http. Teraz próbuję obejść to z $ httpBackend.whenGET (/.*/). PassThrough(), ale wydaje się albo zepsuty, albo nie używam go poprawnie. – doubledriscoll

+0

Domyślam się, co sugeruję, możesz użyć wanilii js, aby utworzyć obiekt z wszystkimi potrzebnymi metodami. Żadna kątowa sztuczka nie jest wymagana. –

Odpowiedz

2

zorientowali się szybki i brudny rozwiązanie problemu: zakomentowanie linię gdzie $ httpBackend jest zastępowany (1365 w kątowa -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; 
    }); 
}); 

To prawdopodobnie łamie coś innego, ale to pozwala mi sprawdzić, co muszę przetestować, a nie wpływa na aplikację produkcyjną, więc jest w porządku ze mną. Mam nadzieję, że w przyszłości zostanie zbudowany taki sposób.

+0

To jest dość brzydkie. To smutne, że nie ma lepszej drogi ... – stej