当前位置: 首页 > 面试题库 >

将模拟注入AngularJS服务

宇文兴言
2023-03-14
问题内容

我写了一个AngularJS服务,我想对其进行单元测试。

angular.module('myServiceProvider', ['fooServiceProvider', 'barServiceProvider']).
    factory('myService', function ($http, fooService, barService) {

    this.something = function() {
        // Do something with the injected services
    };

    return this;
});

我的app.js文件已注册:

angular
.module('myApp', ['fooServiceProvider','barServiceProvider','myServiceProvider']
)

我可以测试DI是否像这样工作:

describe("Using the DI framework", function() {
    beforeEach(module('fooServiceProvider'));
    beforeEach(module('barServiceProvider'));
    beforeEach(module('myServiceProvder'));

    var service;

    beforeEach(inject(function(fooService, barService, myService) {
        service=myService;
    }));

    it("can be instantiated", function() {
        expect(service).not.toBeNull();
    });
});

这证明了可以通过DI框架创建服务,但是接下来我要对服务进行单元测试,这意味着要模拟注入的对象。

我该怎么做呢?

我试过将我的模拟对象放在模块中,例如

beforeEach(module(mockNavigationService));

并将服务定义重写为:

function MyService(http, fooService, barService) {
    this.somthing = function() {
        // Do something with the injected services
    };
});

angular.module('myServiceProvider', ['fooServiceProvider', 'barServiceProvider']).
    factory('myService', function ($http, fooService, barService) { return new MyService($http, fooService, barService); })

但是后者似乎停止了DI所创建的所有服务。

有人知道我可以如何为单元测试模拟注入的服务吗?

谢谢


问题答案:

您可以使用来将模拟注入到您的服务中$provide

如果您具有以下具有依赖项的服务,该服务具有名为getSomething的方法:

angular.module('myModule', [])
  .factory('myService', function (myDependency) {
        return {
            useDependency: function () {
                return myDependency.getSomething();
            }
        };
  });

您可以按如下方式注入myDependency的模拟版本:

describe('Service: myService', function () {

  var mockDependency;

  beforeEach(module('myModule'));

  beforeEach(function () {

      mockDependency = {
          getSomething: function () {
              return 'mockReturnValue';
          }
      };

      module(function ($provide) {
          $provide.value('myDependency', mockDependency);
      });

  });

  it('should return value from mock dependency', inject(function (myService) {
      expect(myService.useDependency()).toBe('mockReturnValue');
  }));

});

请注意,由于有调用,$provide.value因此实际上不需要在任何地方显式注入myDependency。它发生在注入myService的过程中。在此处设置嘲讽依赖时,它可能就很容易成为间谍。



 类似资料:
  • 问题内容: 我想将Mockito模拟对象注入到Spring(3+)bean中,以进行JUnit的单元测试。我的bean依赖项当前是通过在私有成员字段上使用注释来注入的。 我考虑过使用,但是我希望注入的bean实例实际上是一个代理,因此没有声明目标类的私有成员字段。我不希望为依赖项创建一个公共的setter,因为我将纯粹出于测试目的而修改接口。 我遵循了Spring社区提供的一些建议,但是未创建该模

  • 我正在使用Spring boot测试(通过JUnit4和Spring MockMvc)REST服务适配器。适配器只需将向其发出的请求传递给另一个REST服务(使用自定义的RestTemplate),并将附加数据附加到响应中。 我想运行测试来执行控制器集成测试,但想用模拟覆盖控制器中的,以允许我预定义第三方REST响应并防止它在每次测试中被击中。我已经能够通过实例化一个并将其传递给要测试的控制器,该

  • 问题内容: 是否可以在angularJS中将一个服务注入到另一个服务中? 问题答案: 是。遵循angularjs中的常规注入规则。 感谢@simon。最好使用数组注入以避免最小化问题。

  • 问题内容: authService.getLoggedin()返回false或true取决于用户是否登录。然后,我想不允许他们进入网址,如果不允许的话。 但是我收到此错误:错误:[$ injector:modulerr]由于以下原因无法实例化模块WikiApp:[$ injector:unpr]未知提供程序:authService 问题答案: 在配置阶段,您只能要求提供程序($ routeProv

  • 问题内容: 我已经用AngularJS编写了一个服务,但是我无法使其与角度种子处理方式一起使用。 控制器代码如下: 请注意,注释掉的部分工作正常,但我想像(推荐的)第二种方式来处理它。 我得到的错误是照片是未定义的,所以我的猜测是我传递(注入)它的方法是错误的,但是我找不到正确的方法 问题答案: 您需要定义服务: 一些参考: http://docs.angularjs.org/api/angula

  • 问题内容: 我正在集成Angular Bootstrap中的模式,并尝试将代码示例从此处适应我的应用程序。我得到错误: 我需要做什么来使$ modalInstance工作?我从代码示例中看到他们已经编写了它,因此它在函数的范围内,但是我不确定如何在链接控制器时编写东西。 问题答案: 好的-问题实际上出在我的模板上。我已将样本中的partial修改为: 实际上,我需要删除ng-controller参