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

时间:2011-05-23 17:55:46

标签: javascript unit-testing mocking equality qunit

在使用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'qualTo'匹配器(在jsMockito docs中公开)也没有成功:

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

有没有人对如何使这种断言有效?

1 个答案:

答案 0 :(得分:1)

断言是检查对象本身,而不是它的属性,并且JsHamcrest'neanTo'匹配器不对对象进行深度检查(它与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')));