jsMockito方法调用断言未按预期工作

jsMockito method invocation assertion not working as expected

本文关键字:工作 方法 调用 断言 jsMockito      更新时间:2023-09-26

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

我想断言对"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'}));

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

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

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

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

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

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

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

verify(dataStoreMock).create(hasMember('name', 'aaa'));
verify(dataStoreMock).create(hasMember('name', equalTo('aaa')));