如何检查对象是否包含使用 Jasmine 的项目

How to check if object contains an item using Jasmine

我使用 karma 和 jasmine 作为我的测试框架。这是我的代码:

it('add() should add x to the reply object', function() {
    spyOn(ctrl, 'addxReply');
    ctrl.reply = {};
    ctrl.reply.post = 'test post';
    ctrl.add();
    expect(ctrl.addxReply).toHaveBeenCalled();
    console.log(ctrl.reply);
    expect(ctrl.reply).toContain('x');
});

这是我的 ctrl.add():

self.add = function() {
    self.reply['x'] = self.posts[0].id;
    self.addxReply();
};

问题是,当我运行代码时,是这样的returns:

LOG: Object{post: 'test post', x: undefined}
Chromium 48.0.2564 (Ubuntu 0.0.0) Controller: MainCtrl add() should add x to the reply object FAILED
    Expected Object({ post: 'test post', x: undefined }) to contain 'x'.

如您所见,我的回复对象确实包含 x 但行 expect(ctrl.reply).toContain('x'); 仍然失败。知道如何正确验证我的对象是否包含 x?

您创建的内容与预期内容存在错误。注意这一行:

self.reply['x'] = self.posts[0].id;

它期望 ctrl 有一个 属性 "posts" 是一个数组,它有一个索引 0,它有一个名为 [=15] 的 属性 =]. 这些条件中的每一个都不满足

您在 ctrl 的 属性 reply:

下定义了一个单数 属性(不是数组)
ctrl.reply.post

您需要更改测试代码:

it('add() should add x to the reply object', function() {
    spyOn(ctrl, 'addxReply');
    ctrl.reply = {};

    //ctrl needs an array named "posts" with one index
    //containing an object with an "id" property
    ctrl.posts = [ { "id": 'test post' } ];

    ctrl.add();
    expect(ctrl.addxReply).toHaveBeenCalled();
    console.log(ctrl.reply);
    expect(ctrl.reply).toContain('x');
});