【问题标题】:Problems testing $http.get when returning json data with Jasmine and AngularJs使用 Jasmine 和 AngularJs 返回 json 数据时测试 $http.get 的问题
【发布时间】:2016-10-02 06:44:21
【问题描述】:

我整天都在苦苦寻找如何测试 $http.GET 请求的结果,该请求从 .json 文件返回数据。我希望你们中的任何人都可以在这里提供任何帮助。实用的应用程序运行完美,并返回了我期望的正确 json。

我有一个名为“ProgramController”的控制器和一个服务; '数据服务'。

控制器

function ProgramController(DataService) {
    var vm = this;
    vm.timeline = {};

    activate();

    ////////////////
    function activate() {
        DataService.getTimelineData().then(function (data) {
            console.log(data);
        });
    }
}

服务

function DataService($http) {
    var service = {
        getTimelineData: getTimelineData
    };

    return service;

    ///////////////
    function getTimelineData() {
        return $http.get('data/program.json').then(function (httpResult) {
            return httpResult.data;
        });
    }
}

测试用于测试控制器和服务响应;

describe('Program', function () {

var controller, scope, dataserviceMock, httpBackend;

beforeEach(module('mymodule'));

beforeEach(inject(function ($rootScope, $controller, $injector, $q, $httpBackend, $http) {
    scope = $rootScope.$new();
    httpBackend = $httpBackend;
    
    dataserviceMock = {
        getTimelineData: function () {
            return $http.get('data/program.json').then(function (httpResult) {
                return httpResult.data;
            });
        }
    };

    controller = $controller('ProgramController', { 'DataService': dataserviceMock });
}));

describe('when initializing the controller', function () {
    it('object timeline should be something', function () {
        httpBackend.whenGET('data/program.json').respond(mockedTimelineData);
        httpBackend.flush();
        expect(controller.timeline).toEqual(mockedTimelineData);
    });
});

});

当我尝试这个时,测试失败了。尽管“controller.timeline”属性在控制器中定义为“{}”。规范甚至没有达到这一点。它在 httpBackend 的 .flush() 上失败了。

浏览器中的结果显示如下错误;

错误:意外请求:GET js/app/program/program.template.html

预计没有更多请求

其中引用了属于 $stateProvider 定义中定义的 ProgramController 的模板。

你们中有人知道我在这里做错了什么吗?我真的一点头绪都没有。我已经用 $q.defer 做了一些事情并承诺在测试中解决,但我真的无法理解这个......

【问题讨论】:

    标签: angularjs unit-testing testing jasmine httpbackend


    【解决方案1】:

    @myself.. 和@Xnake

    最终设法修复它!最后!我偶然发现了这篇文章; http://gonehybrid.com/how-to-write-automated-tests-for-your-ionic-app-part-2/ 在底部作者也遇到了与我收到的相同类型的问题...禁用模板缓存是我的工作解决方案!

    // disable template caching
    beforeEach(module(function($provide, $urlRouterProvider) {  
        $provide.value('$ionicTemplateCache', function(){} );
        $urlRouterProvider.deferIntercept();
    }));
    

    这里也写了其他的解决方案; https://github.com/angular-ui/ui-router/issues/212#issuecomment-69974072

    【讨论】:

      【解决方案2】:

      您为 mockedTimelineData 提供的值是多少?问题是您的 getTimelineData() 调用了实际的端点,因此它引发了请求错误。当它试图调用'data/program.json'时,你应该模拟返回的数据,例如:

      dataserviceMock = {
              getTimelineData: function () {
                  return $http.get('data/program.json').then(function (httpResult) {
                      return [{'id':'1'},{'id':'2'}];
                  });
              }
          };
      

      这样,当调用 DataService.getTimelineData() 时,它实际上是在调用您提供的模拟。

      更新:

      您可以提供模拟数据的返回值,就像我在原始帖子中一样,或者给定您的原始代码,我提供了工作示例:http://plnkr.co/edit/rrBfJOdq9igy3UeMlK21?p=preview

      我还注意到,在您的控制器中,您从未在响应处理程序中设置vm.timeline,而是设置了console.log(data);

      【讨论】:

      • 好的好的,谢谢!会试试看! mockedTimelineData 与您在 'return [{'id':'1'},{'id':'2'}];' 中描述的类似...只是一些普通的 json 数据。
      • hmm.. 仍然当我执行 httpBackend.flush() 时,它正在请求 'js/app/program/program.template.html' :( 但另一个补充......不应该' httpBackend. whenGET('data/program.json').respond(mockedTimelineData);' 足以模拟http请求中的结果吗?
      • 当离开 .flush 时.. Controller > Dataservice.getTimelineData() 中的“then”根本不会被触发.. expect 也失败了,因为它检查 {} toBe {数据:“数据”}
      • 谢谢你!虽然我真的相信你的实现有效,但当 httpbackend.flush() 或 scope.$apply() 被调用时,我仍然得到相同的“GET js/app/program/program.template.html”响应。你认为它有吗由于我尝试使用 Ionic 而不是普通的 Angular 应用程序来实现这一点,有什么要做的吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多