web-dev-qa-db-fra.com

Jasmine: comment vérifier que le tableau contient un objet?

Ce chèque avait l'habitude de passer:

expect(array).toContain(value)

Tableau:

[
  {"_t":"user","id":1073970419,"email":"[email protected]","name":"Spectator"},
  {"_t":"user","id":4464992042,"email":"[email protected]","name":"Collaborator"},
  {"_t":"user","id":1978569710,"email":"[email protected]","name":"Manage"}
]

Valeur:

{"_t":"user","id":1978569710,"email":"[email protected]","name":"Manage"}

Mais ne passe plus. Quelle est la nouvelle façon d'écrire le même test?

7
hakunin

Il ne contiendra pas cet objet (rappelez-vous, deux objets avec les mêmes propriétés ne sont pas le même objet aux fins de l'égalité), donc toContain ne passera jamais.

Vous devez utiliser un autre test, tel que toEqual ou (si vous souhaitez uniquement rechercher un sous-ensemble de propriétés), toEqual combiné avec jasmine.objectContaining .

Voici l'exemple toEqual de la documentation Jasmine sur cette page:

describe("The 'toEqual' matcher", function() {

  it("works for simple literals and variables", function() {
    var a = 12;
    expect(a).toEqual(12);
  });

  it("should work for objects", function() {
    var foo = {
      a: 12,
      b: 34
    };
    var bar = {
      a: 12,
      b: 34
    };
    expect(foo).toEqual(bar);
  });
});

Notez maintenant foo est égal à bar.

Voici leur exemple en utilisant jasmine.objectContaining:

describe("jasmine.objectContaining", function() {
  var foo;

  beforeEach(function() {
    foo = {
      a: 1,
      b: 2,
      bar: "baz"
    };
  });

  it("matches objects with the expect key/value pairs", function() {
    expect(foo).toEqual(jasmine.objectContaining({
      bar: "baz"
    }));
    expect(foo).not.toEqual(jasmine.objectContaining({
      c: 37
    }));
  });

  // ...
});

Notez que l'objet avec plusieurs propriétés correspond à l'objet partiel fourni à jasmine.objectContaining.

10
T.J. Crowder

La syntaxe dont vous avez besoin est la suivante:

const obj = {"_t":"user","id":1978569710,"email":"[email protected]","name":"Manage"};
expect(array).toContain(jasmine.objectContaining(obj));

Voir le violon: https://jsfiddle.net/bblackwo/4o5u5Lmo/16/

8
BBlackwo

@ T.J.Crowder expliquait déjà précisément le problème. Juste pour vous aider un peu plus, si vous voulez adapter votre exemple, vous aurez besoin de quelque chose comme ça:

var userA = {"_t":"user","id":1978569710,"email":"[email protected]","name":"Manage"}

array =
[
  {"_t":"user","id":1073970419,"email":"[email protected]","name":"Spectator"},
  {"_t":"user","id":4464992042,"email":"[email protected]","name":"Collaborator"},
  userA
]

expect(array).toContain(userA);
1
Pedro Vaz