如何避免AngularJS Jasmine测试中的代码重复

时间:2015-04-01 07:07:24

标签: angularjs unit-testing jasmine

我是一个团队的一员,现在已经在angularjs工作了很长一段时间,我们的单元测试包含的文件包含测试元素所依赖的每个组件的测试逻辑和提供者模拟。

这导致越来越多的代码重复,任何人都可以推荐一种角度方法,我们可以维护测试基础架构,模拟控制器或服务一次,并能够根据需要将该模拟服务注入其他测试中吗? / p>

编辑我正在使用的代码是专有的,但举例来说,您可以考虑通过HTTP请求检索数据的10或15个服务,以不同方式格式化数据并返回该数据。一个例子可能会返回数据数组,因此在每个依赖于服务的文件中我们都会像下面那样初始化代码(减少和修改所以请忽略任何拼写错误或其他错误)

myDataService: {
    getDataParsedLikeY: {
        [{obj1},{obj2}...]
    },
    getDataParsedLikeX: {
        [{obja},{objb}...]
    }
beforeEach(angular.mock.module('myModule'));
beforeEach(angular.mock.inject(function(myDataService) {
    myDataService = function( functionName ) {
        return myDataService[functionName];
    }
    spyOn(myDataService).and.callThrough();
})
}

2 个答案:

答案 0 :(得分:1)

如果您正在寻找一种不在每个测试文件中声明相同模拟代码的方法,我会建议如下所示,尽管我不确定这是否是有角度的方式。

[1]编写代码来声明你的模拟服务,如下面的单元测试,并在angular-mocks.js之后导入

在你的common-mocks.js中(你可以根据需要命名文件)

(function(window){
    window.mymock = {};
    window.mymock.prepare_mocks = function(){
        module(function($provide) {
            $provide.service('myDataService', function(){
                this.getDataParsedLikeY = function(){
                    return 'your mock value';
                };
            });
        });
    };
})(window);

如果你使用karma,你可以这样写,以便在karma.conf.js中导入文件。

files: [
  ...
  '(somedirctory)/angular-mocks.js',
  '(somedirctory)/your-common-mocks.js'
  ...
]

[2]在测试文件中使用mymock.prepare_mocks函数。

describe('Some Test', function() {

    beforeEach(mymock.prepare_mocks);

    it('getDataParsedLikeY', inject(function(myDataService){
        expect('your mock value', myDataService.getDataParsedLikeY());

由于上述原因,您必须编写模拟代码一次并在每个测试文件中共享模拟代码。我希望这可以建议你实现你想要的东西。

答案 1 :(得分:0)

如果您的茉莉花版本是2.x,您可以编写如下的测试代码,而无需编写模拟服务

spyOn(YourService, 'somemethod').and.returnValue('mock value');

在jasmine 1.3中你需要稍微调整一下。

spyOn(YourService, 'somemethod').andReturn('mock value');

我希望这可以帮到你。