在 AngularJS 的服务中模拟服务

Mocking service inside a service in AngularJS

我有以下服务:

DataService.js

app.service("DataService", [
  function () {
    this.getData = function () { return "original value" }
  }
]);

LocationService.js

app.service("LocationService", ["DataService", 
  function(dataSvc) {
    this.getLocationData = function () {
      return dataSvc.getData();
    }
  }
]);

现在进行测试LocationService.js,如何在 LocationService 中模拟 DataService?

这是我目前拥有的 LocationService_tests.js:

describe("LocationService", function () {
  var locationSvc;
  beforeEach(module('myModule'));
  beforeEach(inject(function (LocationService) {
    locationSvc = LocationService;
  }));

  describe("getLocationData", function () {
    it("returns the location data", function () {
      var mockLocationDataValue = "mocked value";
      // ???
      // I want to mock dataSvc.getData within getLocationData
      //  so it returns "mocked value" instead of "original value"
      expect(locationSvc.getLocationData()).toBe(mockLocationDataValue);
    });
  });
});

您可以使用 $provide API 的 service 方法模拟整个服务,并将您的 service 更改为返回的 mock data

describe("LocationService", function () {
  var locationSvc;
  beforeEach(module('myModule'));
  beforeEach(module(function($provide) {
     $provide.service('LocationService', function() {
       this.getData = function() {
          return "mock value";
       }
     });
  });

  beforeEach(inject(function (LocationService) {
    locationSvc = LocationService;
  }));
  ...
});