早上好,
我正在尝试测试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();
});

答案 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;
}]);
虽然为了测试目的似乎付出了太多的努力。 :)