单元测试使用$ resource的服务

时间:2014-06-25 15:34:02

标签: angularjs unit-testing jasmine karma-runner

我正在尝试围绕现有服务包装单元测试,并且无法解释测试结果中显示的数据并导致我的测试失败。首先,球员们:

服务方式:

function createAddressType(newAddressType) {
var defObj = $q.defer();
addressTypesResource = $resource(addressTypesAPI, {}, {query: { method: 'GET'}, create: { method: 'POST'}, update: { method: 'PUT'}, remove: { method: 'DELETE'}});

var newType = addressTypesResource.create({'addresstypes': [
        {'addresstype': newAddressType}
]});
newType.$promise.then(function(data){
    defObj.resolve(data);
});

return defObj.promise;
}

单元测试:

it('should try to create the passed address type on the server', function(){
    var newType = addressTypeService.blankModel('123', '456');
    newType.type_name._value_ = 'Fred';
    httpBackend.expect('POST','/v1/rest/addresstype', {addresstypes:[{addresstype:newType}]})
    .respond({addresstypes:[{addresstype:{
    'type_name': {'_value_': 'Fred'},
    'origin_application': {'_value_': '123'},
    'subsidiary_sid': {'_value_': '456'},
    'sid':{'_value_':'1234567890'}
}}]});
    var returnValue = {};
    var createType = addressTypeService.create(newType);
    createType.then(function(data){
        returnValue = data;
    });
    httpBackend.flush();

    expect(returnValue).toEqual({addresstypes:[{addresstype:{
        'type_name': {'_value_': 'Fred'},
    'origin_application': {'_value_': '123'},
    'subsidiary_sid': {'_value_': '456'},
    'sid':{'_value_':'1234567890'}
}}]});
});

测试结果:

Expected { addresstypes : [ { addresstype : { type_name : { _value_ : 'Fred' }, origin_application : { _value_ : '123' }, subsidiary_sid : { _value_ : '456' }, sid : { _value_ : '1234567890' } } } ], $promise : { then : Function, catch : Function, finally : Function }, $resolved : true } 
to equal { addresstypes : [ { addresstype : { type_name : { _value_ : 'Fred' }, origin_application : { _value_ : '123' }, subsidiary_sid : { _value_ : '456' }, sid : { _value_ : '1234567890' } } } ] }.

有人可以告诉我为什么$promise...部分还在挂着吗?我最初有这个服务不使用$q而只是返回$resource调用,但后来我们开始在内部解析之前将它们传回去(我们最终必须在主要承诺之前和之后添加代码)当它在生产中运行良好,但单元测试给了我白发。

1 个答案:

答案 0 :(得分:2)

预计会在响应中包含承诺。所以你需要检查returnvalue.addresstypes。

expect(returnValue.addresstypes.toString()).toEqual({addresstypes:[{addresstype:{
            'type_name': {'_value_': 'Fred'},
            'origin_application': {'_value_': '123'},
            'subsidiary_sid': {'_value_': '456'},
            'sid':{'_value_':'1234567890'}
        }}]}.toString());