让Jasmine等待Async函数完成

时间:2016-08-19 17:10:35

标签: javascript angularjs unit-testing asynchronous karma-jasmine

我正在尝试为从服务中调用异步函数的函数编写测试,但我不能在我的生活中弄清楚如何让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();

被调用,它立即跳转到期望并失败,因为异步操作尚未完成。

1 个答案:

答案 0 :(得分:1)

尝试在$ scope。$ apply()之前使用$httpBackend.flush(),如角度文档中所述:

  

生产中使用的$ httpBackend始终响应请求   异步。如果我们在单元测试中保留了这种行为,我们就会这样做   必须创建难以编写的异步单元测试   并保持。但测试模拟也无法做出反应   同步;这会改变被测代码的执行。   出于这个原因,模拟$ httpBackend有一个flush()方法,它   允许测试显式刷新挂起的请求。这保留了   后端的异步api,同时允许测试执行   同步。