unit test passthrough mocks karma example unit-testing angularjs mocking

unit testing - test - ¿Cómo anular la respuesta simulada de $ httpBackend en Angular?



unit test angular 4 (5)

¿Es posible anular o redefinir la respuesta simulada en $ httpbackend simulado?

Tengo una prueba como esta:

beforeEach(inject(function ($rootScope, $controller, _$httpBackend_) { $httpBackend = _$httpBackend_; //Fake Backend $httpBackend.when(''GET'', ''/myUrl'').respond({}); //Empty data from server ...some more fake url responses... }

Esto está bien para la mayoría de los casos, pero tengo pocas pruebas en las que necesito devolver algo diferente para la misma URL. Pero parece que una vez que se define el when (). Respond () no puedo cambiarlo después en un código como este:

Respuesta diferente en una única prueba específica:

it(''should work'', inject(function($controller){ $httpBackend.when(''GET'', ''/myUrl'').respond({''some'':''very different value with long text''}) //Create controller //Call the url //expect that {''some'':''very different value with long text''} is returned //but instead I get the response defined in beforeEach }));

¿Cómo puedo hacer eso? Mi código ahora no se puede probar :(


En su prueba use .expect () en lugar de .when ()

var myUrlResult = {}; beforeEach(function() { $httpBackend.when(''GET'', ''/myUrl'') .respond([200, myUrlResult, {}]); }); it("overrides the GET" function() { $httpBackend.expect("GET", ''/myUrl'') .respond([something else]); // Your test code here. });


Los documentos parecen sugerir este estilo:

var myGet; beforeEach(inject(function ($rootScope, $controller, _$httpBackend_) { $httpBackend = $_httpBackend_; myGet = $httpBackend.whenGET(''/myUrl''); myGet.respond({}); });

...

it(''should work'', function() { myGet.respond({foo: ''bar''}); $httpBackend.flush(); //now your response to ''/myUrl'' is {foo: ''bar''} });


Otra opción es:

Puede usar $httpBackend.expect().respond() lugar de $httpBackend.when().respond()

Al usar expect() , puede enviar la misma URL dos veces y obtener respuestas diferentes en el mismo orden en que las presionó.


Puede restablecer las respuestas "cuándo" en la misma función en la que realiza las pruebas.

it(''should work'', inject(function($controller){ $httpBackend.when(''GET'', ''/myUrl'').respond({''some'':''value''}) // create the controller // call the url $httpBackend.flush(); expect(data.some).toEqual(''value''); }); it(''should also work'', inject(function($controller){ $httpBackend.when(''GET'', ''/myUrl'').respond({''some'':''very different value''}) // create the controller // call the url $httpBackend.flush(); expect(data.some).toEqual(''very different value''); });

Vea un ejemplo en este plunker: http://plnkr.co/edit/7oFQvQLIQFGAG1AEU1MU?p=preview


Usa una función en la respuesta, por ejemplo:

var myUrlResult = {}; beforeEach(function() { $httpBackend.when(''GET'', ''/myUrl'').respond(function() { return [200, myUrlResult, {}]; }); }); // Your test code here. describe(''another test'', function() { beforeEach(function() { myUrlResult = {''some'':''very different value''}; }); // A different test here. });