我是AngularJS和JasmineJS的新手。
我已经修改了Angular $ log服务以通过http进行日志记录。我验证它在程序本身中工作正常。但是,在运行Jasmine单元测试时,$ log调用会产生错误。我收到如下消息:
TypeError:TypeError:$ log.warn.logs未定义 http ... [snip] ... angular-mocks.js(第316行)
对于所有不同的$ log函数($ log.error.logs,$ log.info.logs等),消息遵循此模式。
我目前的注射器如下所示:
var $httpBackend, log;
beforeEach(inject(function ($injector, $log) {
log = $log;
//lots of mock http service things here
}));
我也试过这个:
beforeEach(inject(['$log', function (log) {
$log = log;
}]));
而且:
beforeEach(inject(function ($injector) {
log = $injector.get('$log');
// mock http things here
}));
失败的测试看起来像这样:
it('should log error', function () {
$httpBackend.expectPOST('the url for logging');
var controller = createController();
log.warn('Test warning');
$httpBackend.flush();
});
所有对正在测试的代码中的$ log的调用都会导致相同的错误。当我评论它们并删除上面的失败测试时,所有单元测试都通过了。
我应该如何正确设置单元测试?
答案 0 :(得分:1)
答案是angular-mocks.js有问题,而且没有正确实例化日志数组。我下载了最新的非beta版本,它仍然在做同样的事情。数组的实例化使用对$ log.reset()的调用在它们的代码中发生,但不知何故,它们的代码部分未被访问。因此,我通过手动调用$ log.reset()来修复我的问题:
//This works
var $log;
beforeEach(inject(function ($injector) {
$log = $injector.get('$log');
$log.reset();
//continue other stuff
}));
//This also works
var log;
beforeEach(inject(function ($injector, $log) {
log = $log;
log.reset();
//continue other stuff
}));