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

How to pull data from JSON fixture in mock Angular service

本文关键字:JSON 提取 数据 fixture 服务 模拟 Angular      更新时间:2023-09-26

我已经创建了下面的模拟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请求,和/或我需要在我的karma.config.js files数组中声明fixtures路径吗?

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

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夹具。

根据您的方法,最简单的方法是让karma服务于您的fixture文件。在karma.conf文件节中,你可以添加这样的内容:

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

我认为karma从一个叫做base的根目录提供文件,你可能需要使用你给$http的url。

我不太明白你为什么要用一个MockService作为你实际服务的姊妹。这似乎是一个非常重要的方法。更常见的做法是使用实际的服务并模拟后端。在您的测试中出现如下内容:

before(inject(function( $httpBackend, playersService) {
    o = playersService;
    back = $httpBackend;
  back.whenGET('/therealPath').respond({});

}));

您仍然需要一种方法来加载您的fixture文件,但是您可以安装karma-read-json,然后遵循如下模式:

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