测试工厂中方法的参数

时间:2016-03-21 15:49:00

标签: angularjs

早上好,

我正在尝试测试AngularJS工厂中定义的方法的某些字段的值。

我的代码如下:



'use strict';

services.factory('toto', ['$resource', function ($resource) {
    return  $resource('abc',
        {},
        {
            method1: {
                method: 'POST',
                url: 'urlXYZ'
            }
        })
}]);




我想在方法1中检查方法和网址的值。

我尝试了很多东西,但没有一个是好的:



beforeEach(function(){
    module('myApp');
});

describe('tests', function () {
    var toto;

    beforeEach(function () {
        inject(function (_toto_) {
            toto = _toto_;
        });
    });

    // check to see if it has the expected function
    describe('toto service has the expected properties', function() {

        it('should have a method1 function', function () {
            expect(angular.isFunction(toto.method1)).toBe(true);
        });

        it('should have a method1 function with the field method defined', function () {
            expect(toto.method1.url).toBeDefined();
        });

    });

});




它只告诉我"预期未定义为定义。"进行第二次测试。

你知道我怎么能设法做我想要的吗?

编辑:我不确定我是否可以理解...... 我想要做的是检查方法1的url和方法参数的值,以便知道是否有人不会错误地修改它们。

编辑2:这是qwetty帮助下的解决方案。



it('should perform POST request to the expected url', function () {
            $httpBackend
                .expectPOST('the expected url')
                .respond({});
            toto.paginate();
            $httpBackend.flush();

        });




2 个答案:

答案 0 :(得分:1)

在测试中我会打电话给#34;额外的"您的$ resource factory中定义的方法。

it('should perform POST request and method should be available', function () {
    $httpBackend
            .expectPOST('some expected url')
            .respond({}); // does not matter what You return here ...
    toto.method1();

});

答案 1 :(得分:0)

如您所见,资源对象方法toto.method1是一个函数,而不是您在$resource()中定义的对象。

我认为你可以改变工厂的回报

services.factory('toto', ['$resource', function ($resource) {
    var action = {
         method1: {
            method: 'POST',
            url: 'urlXYZ'
        }
    };
    return  {
         resource: $resource('abc',{}, action),
         action: action
     };
}]);

当然,您还需要改变工厂的使用方式。

或使用defineProperty

services.factory('toto', ['$resource', function ($resource) {
    var action = {
         method1: {
            method: 'POST',
            url: 'urlXYZ'
        }
    };
    var resource = $resource('abc',{}, action);
    Object.defineProperty(resource, 'method1', {
        value: action.method1
    });
    return resource;
}]);

虽然为了测试目的似乎付出了太多的努力。 :)