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

时间:2016-02-02 23:55:15

标签: javascript 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();
};

问题是,当我运行代码时,这就是它返回的内容:

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

1 个答案:

答案 0 :(得分:1)

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

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

它希望ctrl具有属性“posts”,这是一个具有索引0且具有名为id的属性的数组。 其中每一个条件都失败

您改为在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');
});