AngularJS承诺在测试Jasmine时不会打电话
我有一些问题,当我试图测试控制器使用承诺与茉莉花 我有以下茉莉花测试:AngularJS承诺在测试Jasmine时不会打电话,angularjs,jasmine,Angularjs,Jasmine,我有一些问题,当我试图测试控制器使用承诺与茉莉花 我有以下茉莉花测试: describe('Testing a controller', function () { var $scope, $root, ctrl, $q, deferred; var MockService; beforeEach(function () { module('myApp'); inject(function ($rootScope, $controller
describe('Testing a controller', function () {
var $scope, $root, ctrl, $q, deferred;
var MockService;
beforeEach(function () {
module('myApp');
inject(function ($rootScope, $controller, $q) {
$root = $rootScope;
$scope = $rootScope.$new();
MockService = {
fetch: function () {
return {
get: function () {
deferred = $q.defer();
return {
$promise: deferred.promise
};
}
};
}
};
ctrl = $controller('myController', {
$scope: $scope,
$root: $rootScope,
MyService: MockService,
});
});
spyOn(MockService, 'fetch').andCallThrough();
});
it('Get data from promise', function () {
$scope.init();
deferred.resolve("It worked!");
$root.$digest();
expect(MockService.fetch).toHaveBeenCalled();
expect($scope.test).toBe('It worked!');
});
});
这是控制器:
controllers.controller('myController', ['$scope','MyService'
function ($scope, myService) {
$scope.init = function () {
myService.fetch().get().$promise.then(function (data) {
$scope.test = data;
}, function (error) {
$scope.error = error;
});
};
}
]);
测试一直失败:“预期未定义为‘It Worked’。”
似乎承诺得到了解决,“then”函数从未被调用。你知道问题出在哪里吗?看起来像一个简单的问题:控制器期望
myService
完全注入另一个模拟服务myService
(注意“M”)。因此,mock从未被使用过,而是一个原创的,它永远不会像您期望的那样解决promise
应该是:
ctrl = $controller('myController', {
$scope: $scope,
$root: $rootScope,
myService: MockService,
});
上面介绍的代码似乎可以工作(现在@dfsq的修复程序已经应用) 我只能通过注释掉以下任一行来重现您遇到的错误:
deferred.resolve("It worked!");
$root.$digest();
。。。这让我想知道,在您的实际代码(而不是上面的示例)中,上述两行代码的等价物的实现是否有问题
在同一测试中,您之前是否在不传递参数的情况下执行了deferred.reject()
,或deferred.resolve()
使用HTMLReporter的jasmine测试演示:
/*角度应用程序*/
(功能(){
“严格使用”;
angular.module('myApp',[])
.controller('myController',['$scope','MyService',
功能($scope,myService){
$scope.init=函数(){
myService.fetch().get().$promise.then(函数(数据){
$scope.test=数据;
},函数(错误){
$scope.error=错误;
});
};
}
]);
})();
/*单元测试*/
(功能(){
“严格使用”;
var consoleLog=document.querySelector(“#log”);
描述('测试控制器',函数()){
var$scope、$root、ctrl、$q、deferred;
虚拟现实服务;
beforeach(函数(){
模块(“myApp”);
注入(函数($rootScope,$controller,$q){
$root=$rootScope;
$scope=$rootScope.$new();
模拟服务={
fetch:function(){
返回{
get:function(){
递延=$q.defer();
返回{
$promise:延期
};
}
};
}
};
ctrl=$controller('myController'{
$scope:$scope,
$root:$rootScope,
MyService:MockService,
});
});
spyOn(MockService,'fetch')。和callthrough();
});
它('从承诺中获取数据',函数(){
consoleLog.innerHTML+=“”+[
“开始测试:”,
“$scope.test:”+$scope.test,
“$scope.error:”+$scope.error
].join(“
”)+“”;
$scope.init();
推迟。解决(“成功了!”);
$root.$digest();
expect(MockService.fetch).tohaveBeenCall();
expect($scope.test).toBe('It worked!');
consoleLog.innerHTML+=“”+[
“测试结束:”,
“$scope.test:“+$scope.test,
“$scope.error:”+$scope.error
].join(“
”)+“”;
});
});
})();
/*茉莉自举*/
(功能(){
“严格使用”;
var jasmineEnv=jasmine.getEnv(),
htmlReporter=new jasmine.htmlReporter();
jasmineEnv.addReporter(htmlReporter);
jasminev.execute();
})();代码>
My bad,已更正该错误,但问题仍然存在。谢谢,这很有帮助。我在代码中犯了一个简单的错误,使它无法工作。