我正在编写一个AngularJs单元测试,需要在其中测试被调用时返回promise的工厂。稍后,我将在测试中使用本地范围的延迟对象手动解决Promise。

我正在尝试做

  let currentUser
  beforeEach(module(($q, $provide) => {
    currentUser = $q.defer()
    $provide.factory('gettingCurrentUser', () => currentUser.promise)
  }))

但这是行不通的,因为似乎无法将$q注入(inject)module块中。当然,如果我将其更改为inject块,则$provide不再可注入(inject)!

我可以用很多不同的方法来解决这个问题,但是这似乎太简单了,不可能成为需要黑客攻击的边缘案例。

这样做的“正确AngularJs”方法是什么?

最佳答案

一个简单的方法就是返回局部变量,该局部变量将在另一个块中(但是在实例化此服务之前)分配给适当的promise。

  let currentUserPromise;

  beforeEach(module(($provide) => {
    $provide.factory('gettingCurrentUser', () => currentUserPromise)
  }));

  beforeEach(inject(($q) => {
    currentUserPromise = $q.resolve(...);
  }));

  it(inject((serviceThatDependsOnGettingCurrentUser) => {
    ...
  }));

10-08 11:34