AngularJS JasmineJS修饰了没有正确注入的$ log对象

时间:2014-07-23 22:53:24

标签: angularjs unit-testing jasmine

我是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的调用都会导致相同的错误。当我评论它们并删除上面的失败测试时,所有单元测试都通过了。

我应该如何正确设置单元测试?

1 个答案:

答案 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
 }));