如何在模拟Angular服务中从JSON fixture中提取数据

时间:2015-07-10 14:30:25

标签: javascript json angularjs jasmine karma-runner

我创建了以下模拟Angular服务来测试控制器。当我运行测试时,我收到错误:Unexpected request: GET ./fixtures/stats.json

mock.players.service.js:

'use strict';

angular.module('mockPlayersService', [])
  .factory('playersService', ['$http', '$q',
    function($http, $q) {
      var playersService = {};

      playersService.stats = $http.get('./fixtures/stats.json');

      playersService.getStats = function() {
        var defer = $q.defer();
        defer.resolve(this.stats);
        return angular.extend({$promise: defer.promise}, this.stats);
      };

      return playersService;
    }]);

我的控制器规范中是否需要执行某些操作来告诉我的测试期望此GET请求,和/或我是否需要在fixtures中声明karma.config.js路径files数组?

编辑:显示我当前(工作)设置的更多信息:

playersService.stats = {
  'firstName': 'John',
  'middleName': 'James',
  'lastName': 'Doe',
  'city': 'Cleveland',
  'state': 'OH',
};

playersService.getStats = function() {
  var defer = $q.defer();
  defer.resolve(this.stats);
  return angular.extend({$promise: defer.promise}, this.stats);
};

我只想将当前的playersService.stats对象移到JSON fixture中。

1 个答案:

答案 0 :(得分:3)

根据您的方法,最简单的方法是让karma服务你的夹具文件。在你的karma.conf文件节中,你可以添加如下内容:

  { pattern:  './fixtures/*.json',
    watched:  true,
    served:   true,
    included: false }

我认为karma提供来自root的文件,你可能需要使用你给$ http的网址。

我不太明白你为什么要打扰MockService姊妹你真正的那个。这似乎是一种非常重的方法。更常见的事情是使用您的实际服务并模拟后端。你的测试中有类似的东西:

before(inject(function( $httpBackend, playersService) {
    o = playersService;
    back = $httpBackend;

  back.whenGET('/therealPath').respond({});


}));

你仍然需要一种方法来加载你的夹具文件,但你可以安装karma-read-json然后按照这样的模式:

var valid_respond = readJSON('./fixtures/stats.json');
$httpBackend.whenGET('/therealPath').respond(valid_respond);