web-dev-qa-db-fra.com

Comment remplacer la réponse simulée de $ httpBackend dans Angular?

Est-il possible de remplacer ou de redéfinir une réponse simulée dans $ httpBackend simulé?

J'ai testé comme ça:

beforeEach(inject(function ($rootScope, $controller, _$httpBackend_) {
  $httpBackend = _$httpBackend_;

  //Fake Backend
  $httpBackend.when('GET', '/myUrl').respond({}); //Empty data from server
  ...some more fake url responses...     
 }

C'est bien dans la plupart des cas, mais j'ai peu de tests pour lesquels je dois retourner quelque chose de différent pour la même URL. Mais il semble qu’une fois que le when (). Respond () soit défini, je ne peux plus le changer ensuite dans le code suivant:

Réponse différente dans un seul test spécifique:

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
}));

Comment je fais ça? Mon code est maintenant indéfectible :(

25
David Votrubec

Les docs semblent suggérer ce style:

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'}
});
27
trans1t

Utilisez une fonction dans la réponse, par exemple:

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.

});
12
John Tjanaka

Une autre option est:

Vous pouvez utiliser $httpBackend.expect().respond() au lieu de $httpBackend.when().respond()

En utilisant expect(), vous pouvez repousser la même URL deux fois et obtenir des réponses différentes dans le même ordre que celui que vous leur avez appliqué.

9
Srikanth Babu K

Dans votre test, utilisez .expect () au lieu 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.
});
6
Zain Rizvi

Vous pouvez réinitialiser les réponses "Quand" dans la même fonction que celle dans laquelle vous effectuez les tests.

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');
});

Voir un exemple dans ce répertoire: http://plnkr.co/edit/7oFQvQLIQFGAG1AEU1MU?p=preview

0
psytau