Утверждение вызова метода jsMockito не работает должным образом

У меня возникли проблемы с утверждением вызова некоторых методов при тестировании объекта Javascript с помощью QUnit + JsMockito. Базовая инфраструктура работает нормально: 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'}));

Есть ли у кого-нибудь идеи о том, как заставить работать такое утверждение?


person Gustavo Barrancos    schedule 23.05.2011    source источник


Ответы (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')));
person Chris Leishman    schedule 24.05.2011
comment
Большое спасибо за прояснение этого. Пожалуйста, не стесняйтесь опубликовать здесь обновление, когда эта функциональность будет объединена. - person Gustavo Barrancos; 24.05.2011
comment
Теперь он доступен в главе jshamcrest: github.com/danielfm/jshamcrest. - person Chris Leishman; 25.05.2011