javascript - AngularJS 工厂中的 Jasmine 测试失败

标签 javascript angularjs jasmine

我在 AngularJS 中创建了以下基本工厂来检索对象数组:

angular.
module('core.beer-retriever').
factory('Beer', ['$resource',
  ($resource) => {
    return $resource('https://www.xxxxxxxxx.com/v2/beers', {}, {
      query: {
        method: 'GET',
        isArray: true
      },
    });
  },
]);

我用 Jasmine 创建了以下测试:

  describe('Beer Service', function() {
    beforeEach(angular.mock.module('core.beer-retriever'));

    beforeEach(inject(function($httpBackend) {
      let beersRetrieved = {
        results: [{
          "id": 192,
          "name": "Punk IPA 2007 - 2010",
        }]
      };
      $httpBackend.whenGET('https://api.xxxxxxxxx.com/v2/beers')
        .respond(beersRetrieved);
    }));

    it('is defined', inject(function(Beer) {
      expect(Beer).toBeDefined();
    }));

    it('returns a resource function', inject(function(Beer) {
      const output = Beer;
      expect(output).toEqual(jasmine.any(Function));
      expect(output.query({}.$promise)).toBeDefined();
    }));

    it('returns beers',
      inject(function(Beer) {
        const output = Beer.query();
        expect(output.length).toEqual(1);
        expect(output[0].id).toEqual(192);
        httpBackend.flush();
      }));
  });

前两次测试成功,但第三次失败:

Expected 0 to equal 1.
TypeError: Cannot read property 'id' of undefined
            at Object.<anonymous> (app/core/beer-retriever/beer-retriever.spec.js:29:25)
            at Object.invoke (app/bower_components/angular/angular.js:4862:19)
            at Object.WorkFn (app/bower_components/angular-mocks/angular-mocks.js:3170:20)

如何找出问题出在哪里?

最佳答案

需要向您的资源 promise 对象添加解析函数。 查看此工作 plunker

output.$promise.then(function(data) {
        console.log(data);
        output = data[0].results;
      });

完整规范如下所示:

  it('returns beers',
    inject(function(Beer, $httpBackend) {
      var output = Beer.query();
      output.$promise.then(function(data) {
        console.log(data);
        output = data[0].results;
      });
      $httpBackend.flush();
      console.log('a11: ' + JSON.stringify(output));
      expect(output.length).toEqual(1);
      console.log(output[0].id);
      expect(output[0].id).toEqual(192);
    }));

关于javascript - AngularJS 工厂中的 Jasmine 测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42738747/

相关文章:

javascript - 根据 ID 编辑 React 中对象数组中的属性

javascript - 使用 C3JS 的 x 轴上的多个值(时间序列)

css - 即使在页面刷新或从应用程序注销后也禁用该按钮

AngularJS:从 Controller 访问指令数据

javascript - 当组件被标记为 ChangeDetectionStrategy.OnPush 时,单元测试失败

javascript - 模拟 Angular 模型的 $http.put 结果 - 单元测试

javascript - 如何将javascript对象值传递给其 "child"对象

javascript - 对象,参数,jquery

javascript - 如何通过 AngularJS $http 从 ASP.Net Web API 2 获取访问 token ?

javascript - Jasmine spy : How to make it work when the spyed function reference is passed?