用Jasmine单元测试测试Angular模块



我在应用程序中使用AngularJS服务。我知道我创建的服务是不可靠的。出于这个原因,我想围绕它构建一些单元测试。虽然该服务在我的AngularJS应用程序中工作得很好,但我在使用Jasmine时遇到了问题。就像我不能加载任何模块。我已经把代码精简到最基本的部分。我不明白我做错了什么。我的代码是这样的:

myService.js

'use strict';
angular.module('customModule', [])
    .factory('$serviceName', [function () {    
        return {    
            isAvailable: function () {
                return true;
            }
        };
    }]
);

myService.spec.js

  describe('customModule', function() {
    beforeEach(function() {
        console.log('loading module...');
        module('customModule');
    });
    describe('$serviceName', function () {
        var myService = null;
        beforeEach(inject(function ($serviceName) {
            console.log('loading service...');
            myService = $serviceName;
        }));
        it('should work', function () {
            console.log('testing');
            var isAvailable = myService.isAvailable();
            console.log(isAvailable);
            expect(1 + 2).toEqual(3);
        });
    });
  })

gruntfile.js

'use strict';
module.exports = function (grunt) {
  grunt.initConfig({
    jasmine: {
      unitTests: {
        src: 'test/*.js',
      }
    }
  });
  require('load-grunt-tasks')(grunt);
  grunt.registerTask('default', ['jasmine:unitTests']);
};

我的茉莉测试正在运行。然而,就像myService.js没有被加载一样。我不知道该怎么做。我也不确定如何在测试中获得'angular'(在myService.js中使用)。

谢谢你的帮助。

你是否在myService.spec.js中加载你的Angular应用?否则$serviceName不能用于依赖注入。

您应该在您的测试文件中添加如下内容:
beforeEach(module('angularApp'));

(当然要将angularApp替换为你正在使用的名称)

使用另一个beforeEach块来处理依赖注入也是一个好主意,这样你就可以在myService.spec.js中的所有测试中使用它。总的来说,你应该有这样的内容:

describe('serviceName', function () {
  beforeEach(module('angularApp'));
  var iMyService
  // Initialize the service
  beforeEach(inject(function ($serviceName) {
      iMyService = $serviceName;
  }));
  it('should check if available', function () {
    var isAvailable = iMyService.isAvailable();
    console.log(isAvailable);
    expect(1 + 2).toEqual(3);
  });
});

最新更新