在angularjs控制器的jasmine单元测试中,我做错了什么?

在angularjs控制器的jasmine单元测试中,我做错了什么?,angularjs,jasmine,Angularjs,Jasmine,我是angularjs新手,正在为一个简单的控制器编写单元测试。但不知何故,它不起作用。守则如下: resetpwdtrl.js(只提到了我正在测试的功能) “Employee”是工厂,sendResetPwdLink是静态方法。它的单元测试是 describe("Reset pwd", function() { var scope, mockModalInstance, mockEmployee, emp, q, deferred, appCtrl; beforeEach(function(

我是angularjs新手,正在为一个简单的控制器编写单元测试。但不知何故,它不起作用。守则如下:

resetpwdtrl.js(只提到了我正在测试的功能)

“Employee”是工厂,sendResetPwdLink是静态方法。它的单元测试是

describe("Reset pwd", function() {
var scope, mockModalInstance, mockEmployee, emp, q, deferred, appCtrl;

beforeEach(function() {
     mockEmployee = {
            id : 0,
            sendResetPwdLink : function(theId) {
                mockEmployee.id = theId;
                deferred = q.defer();
                 deferred.promise.success = function(fn) {
                    return deferred.promise.then(fn);
                };
                //return deferred.promise;

                deferred.promise.error = function(fn) {
                    return deferred.promise.fail(fn);
                 };
                return deferred.promise;
            }
        };

        emp = {
             id : 10
        };

        mockModalInstance = {
             isClosed : false,
            close : function() {
                mockModalInstance.isClosed = true
             }
         };
});

beforeEach(inject(function($controller, $rootScope, $q) {
    scope = $rootScope.$new();
    q = $q;

    $controller('ResetPwdCtrl', {
        '$scope' : scope,
        '$modalInstance' : mockModalInstance,
        'Employee' : mockEmployee,
        'emp' : emp
    });
}));

it("confirm", function() {
    scope.confirm();
    deferred.resolve();
    scope.$root.$digest();
    expect(mockModalInstance.isClosed).toEqual(true);
});

it("confirm2", function() {
    scope.confirm();
    deferred.reject({errorObject:[{type: 'danger', statusCode: 401,text: statusCode}]});
    scope.$root.$digest();
});
});
运行测试时,我遇到以下错误:

重置pwd it确认 如果scope.alert.type未定义,请声明JSON对象


希望这篇文章能帮助你

我会尝试两件事。可能未定义
q
。您可以尝试将mockEmployee定义之前的
更改为此

beforeEach(inject(function($q) { //ADD INJECT
q = $q //DEFINE q
     mockEmployee = {...//This part looks good to me
如果这没有帮助,这就是我在测试中使用q的方式。希望它能引导你走上正确的轨道

getData = {
        get: function (id)
        {
            deferred = q.defer();
            // Place the fake return object here
            deferred.resolve(mockEmployee);
            return { $promise: deferred.promise };
        }
    };
    $rootScope.$apply();

谢谢你的回复,这确实帮了我很大的忙:)

我检查了我正在写的错误情况

deferred.promise.error = function (fn) {
    return deferred.promise.fail(fn);
};
相反,我添加了以下代码来检查错误条件

deferred.promise.error = function (fn) {
    deferred.promise.then(null, fn);
    return deferred.promise;
};
这个很好用

deferred.promise.error = function (fn) {
    return deferred.promise.fail(fn);
};
deferred.promise.error = function (fn) {
    deferred.promise.then(null, fn);
    return deferred.promise;
};