我目前正在测试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的评论。仍然没有工作。
答案 0 :(得分:0)
您需要调用范围摘要。你需要注入$ rootScope然后......
vm = createController();
$rootScope.$digest();
expect(vm.Service.set.callCount).to.equal('1');
$ digest()导致THEN块被执行。
与$ httpBackend.flush()类似的方法,如果您曾经使用过它。