Aos*_*sis 3 javascript unit-testing angularjs karma-jasmine
我正在使用 Karma 和 Jasmine 进行单元测试。我有 app.js 作为主要源文件:
app.service("someServ", function(){
this.sendMsg = function(name){
return "Hello " + name;
}
})
app.factory("appFactory", function ($q, someServ) {
function getData() {
var defer = $q.defer();
defer.resolve("Success message");
return defer.promise;
}
function foo(){
var text = someServ.sendMsg("Message");
alert(text);
}
return {
getData : getData,
foo : foo
}
})
app.controller("mainController",['$scope','$http','appFactory',function($scope, $http, appFactory){
var mct = this;
mct.printData = function(){
var myPromise = appFactory.getData();
myPromise
.then(function(data){
alert("Promise returned successfully. Data : " + data);
}, function(error){
alert("Something went wrong.... Error: " + error);
})
}
mct.showMsg = function(){
appFactory.foo();
}
}]);
Run Code Online (Sandbox Code Playgroud)
我的 testFile.js 如下:
beforeEach(module(function($provide){
$provide.service("someServ", function(){
this.sendMsg = jasmine.createSpy('sendMsg').and.callFake(function(param){})
});
$provide.factory("appFactory", function(someServ, $q){
function getData(){
var defer = $q.defer();
defer.resolve("Success message");
return defer.promise;
}
function foo(){
var facParam = "some text";
someServ.sendMsg(facParam);
}
return {
getData : getData,
foo : foo
}
});
}));
var $scope, mainController, appFactoryMock, someServMock;
beforeEach(inject(function($rootScope, $controller, $http, $q, appFactory, someServ){
appFactoryMock = appFactory;
someServMock = someServ;
$scope = $rootScope.$new();
mainController = $controller("mainController", {
$scope : $scope,
$http : $http,
appFactory : appFactoryMock
});
}));
it('that mainController is calling appFactory methods', function(){
spyOn(appFactoryMock, "getData");
mainController.printData();
scope.$root.$digest();
expect(appFactoryMock.getData).toHaveBeenCalled();
})
it('that appFactory method foo calls someServ sendMsg', function(){
spyOn(appFactoryMock, "foo");
appFactoryMock.foo();
expect(someServMock.sendMsg).toHaveBeenCalled();
});
Run Code Online (Sandbox Code Playgroud)
以上两个测试都失败了。对于第一个,错误是:Cannot read property of undefined第二个:expected spy sendMsg to have been called。第一个错误发生在:app.js 文件,如调用堆栈中所示。我还使用 karma chrome 窗口中的 Debug 选项调试了我的测试。该printData()函数正在调用 app.js 中的实际代码,但我已经模拟了它。
请任何人向我解释为什么会这样以及如何解决这个问题?为什么要调用原始代码以及如何使这两个测试都通过。
Jasmine 的 spy 只检查函数是否已被调用,而不会触发实际的实现。这就是getData().then抛出错误的原因。
正如您在 Jasmine 的文档中所读到的,您需要添加.and.callThrough()以完成原始函数。
| 归档时间: |
|
| 查看次数: |
4806 次 |
| 最近记录: |