【问题标题】:inject utility services to jasmine test向 jasmine 测试注入实用程序服务
【发布时间】:2017-02-01 12:28:54
【问题描述】:

这个问题不是关于包含一个服务来测试或提供一个替代服务的模拟。

情况:

我想测试的工厂是关于解析一组属性并通过 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 框架有一个非常不直观的工作流程,首先运行并初始化所有描述块,然后再运行 beforeEach。顺序写在 cmets 中。

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

感谢您帮助我!

【问题讨论】:

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


    【解决方案1】:

    如果你的 UtilService 是一个工厂,你可以将服务注入到每个测试之前,每个测试

    beforeEach(function() {
        module('app');
    
        var UtilService;
    
        inject(function(_UtilService_) {
    
            UtilService = _UtilService_;
    
        });
    });
    

    jasmine 设置测试的方式,只要您在 Karma 配置中正确加载所有依赖项,您就不必使用 $injector 来拉入服务。

    由于下划线可能有点混乱,Angular 将提供下划线服务,因此您每次都可以创建一个新实例。

    【讨论】:

    • 这只是服务注入的另一种写法。这不会影响 jasmine 的执行顺序。注入仍然作为 #8 执行,因此在 #3 之后,我需要使用 Util-Service。有没有办法在 Karma 配置中预定义 Util 服务?还是您的意思是指定必要 *.js 文件的文件列表?问题不在于正确注入服务,而在于比 beforeEach() 更早地注入服务。
    猜你喜欢
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    相关资源
    最近更新 更多