1

在使用 QUnit + JsMockito 测试 Javascript 对象时,我无法做出一些方法调用断言。基本的基础设施工作正常:Qunit、JsHamcrest(Jsmockito 依赖项)和 Jsmockito 在套件定义中正确初始化。

我想用一个对象作为参数来断言对“dataStore#create”方法的调用,如下所示:

var store = {create: function(arg) {}};

test("save()", function() {
  var dataStoreMock = mock(store);

  var objectUnderTest = { value: 'aaa',
                        dataStore: dataStoreMock,
                        save: function() {this.dataStore.create({name: this.value});}}

objectUnderTest.save();
verify(dataStoreMock).create({name: 'aaa'});
});

我收到断言错误:“想要但未调用:obj.create(等于 [object Object])”

我的第一个怀疑是对象相等没有像我预期的那样工作,证据是断言用于传递原始数据类型而不是对象的调用时有效:

this.dataStore.create(this.value); //actual code
verify(dataStoreMock).create('aaa'); //test

我尝试使用 jsHamcrest 'equalTo' 匹配器(在 jsMockito 文档中公开)也没有成功:

verify(dataStoreMock).create(equalTo({name: 'aaa'}));

有人对如何使这种断言起作用有任何想法吗?

4

1 回答 1

1

断言是检查对象本身,而不是其属性,并且 JsHamcrest 'equalTo' 匹配器不会对对象进行深入检查(它与 javascript '==' 运算符相同)。

您可以简单地检查它是否是一个对象:

verify(dataStoreMock).create(object());

或者有一个 JsHamcrest 匹配器“hasMember”,您可以将其用作:

verify(dataStoreMock).create(hasMember('name'));

如果您使用的是 jshamcrest 0.6.4 或更高版本(或当前 HEAD),那么您还可以通过将匹配器作为第二个参数传递给 hasMember 来验证成员:

verify(dataStoreMock).create(hasMember('name', 'aaa'));
verify(dataStoreMock).create(hasMember('name', equalTo('aaa')));
于 2011-05-24T13:56:04.997 回答