【问题标题】:Testing Angular Modules with Jasmine Unit Tests使用 Jasmine 单元测试测试 Angular 模块
【发布时间】:2014-08-13 17:11:47
【问题描述】:

我在我的应用程序中使用 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 没有被加载。我不知道该怎么做。我也不确定如何在测试中获得“角度”(在 myService.js 中使用)。

感谢您的帮助。

【问题讨论】:

    标签: javascript angularjs gruntjs jasmine


    【解决方案1】:

    您是否在 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);
      });
    });
    

    【讨论】:

    • 这很奇怪。我更新了茉莉花测试以更好地解释问题。 customModule $serviceName - 应该检查是否可用... log: loading module... log: testing × 应该检查是否可用
    • 这里有趣的部分是,console.log('loading service...');永远不会被调用。我不明白为什么会这样。
    • 我发现问题在于注入调用引发了错误。这意味着 angular-mocks.js 没有正确加载。我应该如何加载 angular-mocks.js?现在,我已将它添加到与 grunt-contrib-jasmine 任务关联的供应商数组中。
    猜你喜欢
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    相关资源
    最近更新 更多