Jasmine:如何检查该数组是否包含对象?

hak*_*nin 11 jasmine

此检查过去通过:

expect(array).toContain(value)
Run Code Online (Sandbox Code Playgroud)

阵:

[
  {"_t":"user","id":1073970419,"email":"email3@example.org","name":"Spectator"},
  {"_t":"user","id":4464992042,"email":"email4@example.org","name":"Collaborator"},
  {"_t":"user","id":1978569710,"email":"email5@example.org","name":"Manage"}
]
Run Code Online (Sandbox Code Playgroud)

值:

{"_t":"user","id":1978569710,"email":"email5@example.org","name":"Manage"}
Run Code Online (Sandbox Code Playgroud)

但不再过去了.什么是编写相同测试的新方法?

T.J*_*der 16

它不会包含对象(请记住,为了相同的目的,具有相同属性的两个对象不是同一个对象),因此toContain永远不会通过.

您需要使用另一个测试,例如toEqual或(如果您只想检查属性的子集),toEqual结合使用jasmine.objectContaining.

以下toEqual是该页面上Jasmine文档的示例:

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);
  });
});
Run Code Online (Sandbox Code Playgroud)

注意现在foo等于bar.

以下是他们使用的示例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
    }));
  });

  // ...
});
Run Code Online (Sandbox Code Playgroud)

请注意具有多个属性的对象如何与提供的部分对象匹配jasmine.objectContaining.

  • 谢谢,给其他读者一个例子怎么样?我如何重写测试? (2认同)

BBl*_*kwo 15

您需要的语法是:

const obj = {"_t":"user","id":1978569710,"email":"email5@example.org","name":"Manage"};
expect(array).toContain(jasmine.objectContaining(obj));
Run Code Online (Sandbox Code Playgroud)

请参阅小提琴:https://jsfiddle.net/bblackwo/4o5u5Lmo/16/

  • @hakunin 接受的答案没有明确显示如何将 `toContain()` 与 `jasmine.objectContaining()` 一起使用,它只是暗示。我的回答明确显示了如何将它们一起使用。 (2认同)

Ped*_*Vaz 6

@TJCrowder 已经准确地解释了这个问题。只是为了帮助您更多一点,如果您想调整您的示例,您需要这样的东西:

var userA = {"_t":"user","id":1978569710,"email":"email5@example.org","name":"Manage"}

array =
[
  {"_t":"user","id":1073970419,"email":"email3@example.org","name":"Spectator"},
  {"_t":"user","id":4464992042,"email":"email4@example.org","name":"Collaborator"},
  userA
]

expect(array).toContain(userA);
Run Code Online (Sandbox Code Playgroud)