Angularjs 如何用茉莉花测试这种测角方法
在我的角度控制器中有以下方法。注意Upload.Upload方法在apply方法中Angularjs 如何用茉莉花测试这种测角方法,angularjs,jasmine,Angularjs,Jasmine,在我的角度控制器中有以下方法。注意Upload.Upload方法在apply方法中 $scope.apply = function () { $scope.validationErrors.reset(); if ($scope.firstName.trim() === '') { $scope.validationErrors.firstName = 'First name is required.'; } if ($scope.valida
$scope.apply = function () {
$scope.validationErrors.reset();
if ($scope.firstName.trim() === '') {
$scope.validationErrors.firstName = 'First name is required.';
}
if ($scope.validationErrors.isValid()){
Upload.upload({
url: '/apply',
fields: {
'first_name': $scope.firstName,
'last_name': $scope.lastName
},
file: $scope.localFile,
fileName: $scope.filename
}).success(function(data){
if (data === 'successfully saved application'){
$location.path('/thanks/' + $scope.jobId);
}else{
$scope.errorMessage = 'Woops, something went wrong with your application. ' + data;
}
});
}
};
我不知道如何测试该方法的成功部分。这是我到目前为止所做的,但它在scope.apply()行上抛出了一个错误,表示success未定义
describe('apply calls the uploader upload method', function () {
var upload;
var returnMessage = 'successfully saved application';
var deferred;
beforeEach(inject(function ($rootScope, $controller, $httpBackend, $http, $q, Upload) {
deferred = $q.defer();
upload = Upload;
httpBackend = $httpBackend;
scope = $rootScope.$new();
httpBackend.when('POST', '/apply').respond(returnMessage);
$controller('ApplyController', {
$scope: scope,
$routeParams: { id: 1 },
$http: $http,
$q: $q,
Upload: Upload,
jobService: jobService
});
spyOn(upload, 'upload').and.returnValue(deferred);
}));
it('calls the Upload upload method', function () {
scope.firstName = scope.lastName = scope.phoneNumber = scope.zipCode = scope.filename = 'test';
scope.jobId = 1;
scope.emailAddress = 'test@test.com';
scope.apply();
expect(upload.upload).toHaveBeenCalled();
});
});
如何测试此方法的成功部分?谢谢。您必须执行$httpBackend.flush()才能获得模拟http响应。假设其他一切都是正确的,下面的测试应该通过。查看更多信息 旁白:-在每次测试之后,验证通过expect api定义的所有请求都已发出,并且没有需要刷新的未决请求
afterEach(function() {
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
编辑:
发现了另一个问题。设置间谍时,您应该延迟返回。承诺而不是延迟。试试这个:-
spyOn(upload, 'upload').and.returnValue(deferred.promise);
如果这也不起作用,您可以为此共享一个plunker吗?您必须执行$httpBackend.flush()以获得模拟的http响应/谢谢,但即使添加后,我仍然会收到相同的错误-“undefined不是一个函数…Upload.Upload(..)。successI已更新了答案。看看是否有帮助。如果不是的话,你能为这个分享一个宝物吗?不幸的是,它没有。我不太确定如何在测试的同时为整个应用程序准备一个插件。我最终编写了一种不同的测试,它不担心成功方法,而是测试location.path或scope.errorMessage,这实际上是最终真正需要测试的功能。这很有效,所以我会坚持下去。再次感谢。
spyOn(upload, 'upload').and.returnValue(deferred.promise);