单元测试具有依赖性的角度服务

时间:2017-01-10 00:13:10

标签: javascript angularjs unit-testing

我有以下Jasmine单元测试:

describe('myService', function () {
    var myService, $q;

    // Instantiate the app
    beforeEach(module('myApp'));

    beforeEach(inject(function (_myService_, fileSystemService, $q) {
        myService = _myService_;
        spyOn(fileSystemService, 'listFiles').and.callFake(function () {
            var deferred = $q.defer();
            deferred.resolve('mockresult');
            return deferred.promise;
        });
    }));

    it('checks the number of outbound files', inject(function ($rootScope) {
        var result;
        myService.sendOutboundFiles2().then(function (res) {
            result = res;
        });
        $rootScope.$digest();
        expect(result).toBe('mockresult');
    }));
});

测试这个非常简单的服务功能:

sendOutboundFiles2() {
     return fileSystemService.listFiles('Cached/Outbound').then(function(outfiles) {
         return outfiles;
     })
}

然而,当测试运行时,它失败并出现虚假的Error: Unexpected request: GET blah\blah\blah.html No more request expected at $httpBackend错误,但我不知道为什么这个测试和服务依赖都没有对$ httpBackend做任何事情。

更多信息

如果我注释掉我现有的控制器测试,我会收到此错误: service test only

如果我重新添加我的控制器测试,我会收到此错误: enter image description here

因此,根据我添加或删除的测试,GET错误中的HTML文件会发生变化。但是所有的控制器测试运行良好。 WTF?!?!?!??!?!?

1 个答案:

答案 0 :(得分:0)

问题是由Ionic将所有模板强烈预取到缓存中引起的。不知道为什么在测试控制器时不会发生这种情况。该问题仅在我测试服务时出现。无论如何,我找到了这个帖子:Karma test breaks after using ui-router,相关的修复方法是在注入任何依赖项之前添加这些片段:

  beforeEach(module(function($provide) {
    $provide.value('$ionicTemplateCache', function(){} );
  }));

这会截断$ ionicTemplateCache并阻止它尝试将所有ui-router模板预加载到Ionic缓存中。