我是茉莉花框架的新手。我已经完成了一些教程并学习并开始编写单元测试。这里面临的一个问题是描述。 我有一个控制器,我可以调用服务调用来获取数据。请参阅下面的代码。
$scope.getEmpInfo = function() {
EmpService.getInfo($scope.empid)
.then(function(data) {
$scope.empData = data;
$scope.populateEmpData($scope.empData);
}, function(reason) {
//do nothing
}
}
现在,我想为上述方法编写一个单元测试。我能够使用诺言对serice进行间谍,但我无法窥探$scope.populateEmpData()
。这是我的测试用例。
describe('Emp data', function() {
var d, scope;
beforeEach(function() {
module("emp");
module("emo.info");
});
describe('empcontroller', function() {
beforeEach(inject(function($q,_EmpService_, $controller,$rootScope){
d = $q.defer();
empService = _EmpService_;
spyOn(empService,"getInfo").and.returnValue(d.promise);
scope = $rootScope.$new();
empCtrl = $controller("empController", {
$scope: scope,
});
}));
it('should get the Employee information ', function() {
scope.getEmpInfo();
spyOn(scope,'populateEmpData');
expect(EmpService.getInfo).toHaveBeenCalled();
//Here im getting the error.
expect(scope.populateEmpData).toHaveBeenCalled();
});
});
});
请帮助解决此问题。提前谢谢。
答案 0 :(得分:1)
这是因为你没有解决承诺。你必须在spyOn中做出改变。
- spyOn(empService,"getInfo").and.callFake(function() {
return {
then : function(success, error) {
success();
}
} }
Now, it will go into the success callback and will try to call $scope.populateEmpData();
答案 1 :(得分:0)
你永远不会解决你的承诺。你需要调用$ scope。$ apply()。
为什么这有必要?因为使用$ q服务做出的任何承诺 每次运行角度时都要处理要解决/拒绝的问题 消化周期。从概念上讲,对.resolve的调用改变了状态 承诺并将其添加到队列中。每次角度的消化周期 运行,任何未完成的承诺将被处理和删除 队列。 Unit Testing with $q Promises in AngularJS
检查上面的链接它会对你有所帮助。