我正在尝试为从服务中调用异步函数的函数编写测试,但我不能在我的生活中弄清楚如何让Jasmine在执行expect函数之前等待我的异步操作完成。
describe('vm.submitLogin', function () {
var $scope;
var $q;
var deferred;
var $controller;
beforeEach(module('myModule'));
beforeEach(inject(function (_$controller_, _$rootScope_, _$q_, LoginService, $httpBackend) {
$q = _$q_;
$scope = _$rootScope_.$new();
$controller = _$controller_;
deferred = _$q_.defer();
spyOn(LoginService, 'login').and.callFake(function () {
return $.Deferred().resolve({success: true, twoFactorRequired: false});
});
$httpBackend.expectGET("/data/I/need/to/mock").respond({"uri": "http://localhost:8081/data/I/need/to/mock.json"});
var vm = $controller('LoginCtrl', { $scope: $scope});
vm.submitLogin();
$scope.$apply();
}));
it('should work, please work...', inject (function ($httpBackend, LoginService) {
expect(something);
}));
});
我曾尝试使用Jasmine的“完成”功能,但我无法弄清楚如何实现它。
在这个例子中,只要
$scope.$apply();
被调用,它立即跳转到期望并失败,因为异步操作尚未完成。
答案 0 :(得分:1)
尝试在$ scope。$ apply()之前使用$httpBackend.flush(),如角度文档中所述:
生产中使用的$ httpBackend始终响应请求 异步。如果我们在单元测试中保留了这种行为,我们就会这样做 必须创建难以编写的异步单元测试 并保持。但测试模拟也无法做出反应 同步;这会改变被测代码的执行。 出于这个原因,模拟$ httpBackend有一个flush()方法,它 允许测试显式刷新挂起的请求。这保留了 后端的异步api,同时允许测试执行 同步。