为茉莉花测试注入公用事业服务

时间:2016-09-23 15:18:00

标签: javascript angularjs unit-testing jasmine karma-jasmine

这个问题不是要包含测试服务或提供替换服务的模拟。

情况:

我想测试的工厂是解析一组属性并通过getter函数提供这些信息。下面的伪代码描述了现在正在发生的事情(假设它有效,尽管根据数据长度创建动态测试非常麻烦。)

...
describe('fancyTest', function() {
    // 1
    beforeEach(function() {
        // 7
        module('app');

        inject(function($injector) {
            // 8
            Factory = $injector.get('app.ToTestFactory');
            UtilService = $injector.get('app.Util');  // bad, as to late...
        });
    });
    // 2
    describe('dataTest', function() {
        // 3
        // Goal: data = UtilService.getData('dataset1');
        data = [{id:'test1'}, {id:'test2'}];
        for (i = 0, l = data.length; i < l; i += 1) { 
            test(data[i]);
        }

        function test(properties) {
            // 4
            describe('datatest #' + i, function() {
                 var elem;
                 // 5
                 beforeEach(function() {
                     // 9
                     elem = new Factory(properties)
                 });
                 // 6
                 it('should provide the correct id', function() {
                     // 10
                     expect(elem.id()).toBe(properties.id);
                 });

                 ...
            });
        }
    }
...
}

UtilService.getData()是一个简单的方法,它从一些仅在执行测试时注入的常量中读取数据。它可能很重要,我不想异步加载它们。

问题:

Jasmine框架具有非常无意义的工作流程,首先运行并初始化所有describe块,然后再运行beforeEach。订单写在评论中。

在数据循环运行之前,我是否没有机会注入UtilService?

感谢您帮助我!

1 个答案:

答案 0 :(得分:1)

如果您的UtilService是工厂,您可以使用每个

之前的服务将服务注入每个测试
beforeEach(function() {
    module('app');

    var UtilService;

    inject(function(_UtilService_) {

        UtilService = _UtilService_;

    });
});

jasmine设置测试的方式,只要你在Karma Config中正确加载所有依赖项,就不应该使用$ injector来提供服务。

由于下划线可能有点令人困惑,因此angular会提供强调服务,因此您每次都可以创建一个新实例。