javascript - 如何使用 Angular 对带有 Promise 和回调函数的函数进行单元测试

标签 javascript angularjs unit-testing jasmine karma-jasmine

对如何将 $httpBackend 和 Promise 与单元测试结合起来有点困惑。我试图测试的功能(在 Controller 中)是:

  vm.getData = (callback) => {
    $http.get('http://localhost:3000/cars?_start=0&_end=100').then(result => {
      return callback(result.data);
    });
  };

失败的测试看起来像这样......

  describe('controllerToTest', () => {
    beforeEach(() => {
      angular.module('test', [])
      .controller('controllerToTest', require('./controllerToTest'));
    });

    beforeEach(angular.mock.module('test'));

    beforeEach(angular.mock.inject($injector => {
      $rootScope = $injector.get('$rootScope').$new(true);
      $q = $injector.get('$q').defer();
      $httpBackend = $injector.get('$httpBackend');
      $httpBackend.when("GET", "http://localhost:3000/cars?_start=0&_end=100").respond({});
      vm = $injector.get('$controller')('controllerToTest', {});
    }));


    it('should return the callback function', () => {
      let whatAmI = null;
      let callbackFn = () => {
        whatAmI = 'boom'
      };

      $q.resolve(
        (x) => {
          return x();
        }
      );

      vm.getData(callbackFn);

      $rootScope.$digest();

      expect(whatAmI).toEqual('boom');
    });
  }

最佳答案

$httpBackend 不同步返回结果。要从待处理的 $httpBackend 请求获取响应,应使用 $httpBackend.flush() 方法:

...
vm.getData(callbackFn);

$httpBackend.flush();

$rootScope.$digest();

expect(whatAmI).toEqual('boom');
...

只需确保 $httpBackendit 函数的作用域中可用

关于javascript - 如何使用 Angular 对带有 Promise 和回调函数的函数进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33907287/

相关文章:

java - 如何关闭 EasyMock 对象的记录?

javascript - AngularJS & Jasmine : Testing that a method on the scope was called

ruby-on-rails - 为 Rails 中的一个 TestCase 切换 DB-Connection

javascript - 双击在 JQuery FullCalendar 上添加约会

javascript - Angular 2 模板的元素引用无法正常工作

javascript - 在 AngularJS 中添加和删除数组中的嵌套项目

javascript - 如何从 Isolate Scope 指令调用 Controller 方法?

c++ - 是否可以在非托管代码中使用 Mock/Fake 框架?

更改 HTML 的 JavaScript 函数不起作用

javascript - 尝试在新选项卡加载时滚动到目标 ID