#javascript #node.js #angularjs #jasmine
#javascript #node.js #angularjs #jasmine
Вопрос:
Я тестирую службу AngularJS, и как часть этого, я хочу убедиться, что определенный обратный вызов никогда не вызывается. Прямо сейчас мой тест выглядит так
it('should succeed to login the user', function () {
var params = {
email: 'foo@bar.com',
password: 'hunter2'
};
var member = {
remoteAddress: '1.2.3.4'
};
$httpBackend.expectPOST(fakeApiUrl '/1/authentication/login', params)
.respond(200, member);
auth.login(params.email, params.password).then(
function (m) {
expect(m.remoteAddress).toBe(member.remoteAddress);
},
function () {
// I want this to be fail()
expect(true).toBe(false);
}
);
$rootScope.$digest();
$httpBackend.flush();
});
Проблема в том, что для того, чтобы выполнить тест с ошибкой, если этот обратный вызов запущен, я должен сделать что-то грязное, например expect(true).toBe(false)
.
Есть ли лучший способ добиться этого? Например, есть ли более подходящий сопоставитель, который я мог бы использовать, или я должен структурировать свой тест по-другому?
Комментарии:
1. Может быть, передать spy (
jasmine.createSpy()
) в качестве обратного вызова ошибки и проверить сexpect(mySpy).not.toHaveBeenCalled();
помощью?2. Посмотрите на шпионов
3. В связи с предложениями spy взгляните на поддержку асинхронного тестирования в версии 2.0 и в версии 1.3 .
4.
auth.login
должен вернуть обещание, которое вы должны отклонить.5. @KrzysztofSafjanowski: Что вы имеете в виду?
Ответ №1:
Один из способов сделать это — создать шпиона и утверждать, что шпион никогда не вызывался…
var mySpy = jasmine.createSpy('mySpy');
$httpBackend.expectPOST(fakeApiUrl '/1/authentication/login', params)
.respond(200, member);
auth.login(params.email, params.password).then(
function (m) {
expect(m.remoteAddress).toBe(member.remoteAddress);
},
mySpy
);
$rootScope.$digest();
$httpBackend.flush();
expect(mySpy).not.toHaveBeenCalled();
Комментарии:
1. @cdmckay — пожалуйста, объясните мне, как вы хотите протестировать обратный вызов mySpy, который должен быть исправлен при ошибке?
Ответ №2:
it('should succeed to login the user', function () {
var params = {
email: 'foo@bar.com',
password: 'hunter2'
};
auth.login = jasmine.createSpy().andReturn($q.reject());
auth.login(params.email, params.password).then(
function (m) {
expect(m.remoteAddress).toBe(member.remoteAddress);
},
function () {
// I want this to be fail()
expect(true).toBe(false);
});
$scope.$digest();
});