Javascript Jasmine Spy:获取returnValue中的错误

Javascript Jasmine Spy:获取returnValue中的错误,javascript,angularjs,unit-testing,jasmine,karma-jasmine,Javascript,Angularjs,Unit Testing,Jasmine,Karma Jasmine,我正试图用jasmine spy编写单元测试用例。下面是我的服务代码 function reset(someParam) { var deferred = $q.defer(); svcTypes.getTasksWithRoles().then(function (types) { if (types.HadError) return; // do some stuff.. deferred.resolve(results); },

我正试图用jasmine spy编写单元测试用例。下面是我的服务代码

function reset(someParam) {
var deferred = $q.defer();

svcTypes.getTasksWithRoles().then(function (types) {
    if (types.HadError) return;

    // do some stuff..               

    deferred.resolve(results);
}, function (errorResponse) {
    deferred.reject(errorResponse);
});
return deferred.promise; }
下面是我的单元测试用例:

describe('tests for svcWorkordertypes', function () {

beforeEach(angular.mock.module('workorders.service'));
beforeEach(angular.mock.module('workordertypes.service'));


var svcWorkordertypes;
var svcTypes;
var $q, $httpBackend;
beforeEach(angular.mock.inject(function (_svcWorkordertypes_, _svcTypes_, _$q_, _$httpBackend_) {
    svcWorkordertypes = _svcWorkordertypes_;
    svcTypes = _svcTypes_;
    $q = _$q_;
    $httpBackend = _$httpBackend_;

}));

//This is working fine.
it('all controls should be set', function () {            
    expect(svcWorkordertypes).toBeDefined();
    expect(svcTypes).toBeDefined();
    expect($q).toBeDefined();
    expect($httpBackend).toBeDefined();

});

it('test reset method', function () {
    //Arrange
    var someParam = 'test';
    var types = [{ RoleList: 'newRoleList', isHeader: true, Roles: 'testRole' }];
    $httpBackend.when("GET", 'null/tasks/types?$select=IncludeRoles').respond(200, JSON.stringify(types));
    spyOn(svcTypes, 'getTasksWithRoles').and.returnValue(function () {
        var deferred = $q.defer();
        deferred.resolve(JSON.stringify(types));
        return deferred.promise;
    });

    //Act
    var result = svcWorkordertypes.reset(selectedRoleName);


    //Assert
    result.then(function (res) {
        console.log(res + ' res output...');
        //expect(JSON.stringify(res)).toEqual(JSON.stringify(types));
    });
    //expect(svcTypes).toBeDefined();
}) });
以下是错误:


我也用callFake尝试了很多方法。我在上发现了一个类似的问题,但它对我没有帮助。

GetTaskWithRoles应该返回一个承诺,并且它被模拟为返回一个承诺的函数

应该是:

spyOn(svcTypes, 'getTasksWithRoles').and.returnValue(
  $q.resolve(JSON.stringify(types))
);

谢谢埃斯特斯的回复。现在,我没有得到那个错误。然而,它仍然返回承诺中的零对象。调试器未进入“//做一些事情”代码。第一个调试器转到“svcTypes.getTasksWithRoles()”,然后直接转到语句的末尾,即return deferred.promise;。