角度摩卡测试未触发成功/错误

时间:2016-04-01 12:30:43

标签: javascript angularjs unit-testing mocha sinon

我目前正在测试mocha中的控制器。控制器具有激活功能,该功能应根据响应触发成功/失败。我无法在测试期间触发失败或成功功能。

viewController.js:

(function() {
'use strict';
angular
.module('app')
.controller('viewCtrl', viewCtrl);
function viewCtrl(Service) {
    vm.Service = Service;

    activate();
    function activate() {
        vm.Service.get().then(success, failure);
        function success(data) {
            if (!data || data == 401) {
                failure(data);
            }
        }
        function failure(error) {
            if (error) {
                console.error("Loading question failed:", error);
                vm.Service.set();
            }
        }
    }
}
})();

viewControllerTest.js:

describe('question_view_controller', function() {
    var httpBackend, controller;
    var expect = chai.expect;
    var assert = chai.assert;
    var Service = {};
    var createController;

    beforeEach(function(){
        angular.mock.module('ui.router');
        angular.mock.module('question');

        Service = {
            set : sinon.stub(),

            get : sinon.stub().returns(Promise.reject({error:{}}));
        }
    })

    beforeEach(inject(function($httpBackend,$controller,$q){
        httpBackend = $httpBackend;
        createController = function(){
            return $controller('ViewCtrl', {
                $scope: scope,
                Service: Service
            });;
        }
}));

afterEach(function(){
    httpBackend.verifyNoOutstandingExpectation();
    httpBackend.verifyNoOutstandingRequest();
});

describe('activate', function () {
    describe('get.then() error', function(){
        beforeEach(function(){
            Service.get.returns(Promise.reject({error:{}}))
        })
        it('should do nothing and setFailedQuestion should be called once', function(){
            vm = createController();
            scope.$digest();
            expect(vm.Service.set.callCount).to.equal('1');
        })

    })

});

});

如果有人能指出我的错误或提供任何有用的见解。请再问一下。

更新: 编辑代码以反映danday74的答案。仍然没有工作。

更新: 编辑代码以反映danday74的评论。仍然没有工作。

1 个答案:

答案 0 :(得分:0)

您需要调用范围摘要。你需要注入$ rootScope然后......

vm = createController();
$rootScope.$digest();
expect(vm.Service.set.callCount).to.equal('1');

$ digest()导致THEN块被执行。

与$ httpBackend.flush()类似的方法,如果您曾经使用过它。