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

如何在茉莉花单元测试中解决$ q.all承诺?

孔逸春
2023-03-14
问题内容

我的控制器具有如下代码:

$q.all([qService.getData($scope.id), dService.getData(), qTService.get()])
.then(function (allData) {
  $scope.data1 = allData[0];
  $scope.data2 = allData[1];
  $scope.data3 = allData[2];
});

在我的单元测试中,我正在做这样的事情:

beforeEach(inject(function($rootScope, $q, $location){// and other dependencies... 
  qServiceSpy = spyOn(_qService, 'getData').andCallFake(function () {
    var data1 = {
      id: 1,
      sellingProperty: 1,
    };
    var d = $q.defer();
    d.resolve(data1);
    return d.promise;
  });

  dServiceSpy = spyOn(_dService, 'getData').andCallFake(function () {
    var data2 = [{ "id": "1", "anotherProp": 123 }];
    var d = $q.defer();
    d.resolve(data2);
    return d.promise;
  });
  qTServiceSpy = spyOn(_qTService, 'get').andCallFake(function () {
    var data3 = [{ id: 0, name: 'Rahul' }];
    var d = $q.defer();
    d.resolve(data3);
    return d.promise;
  });
  rootScope = $rootScope;
});

现在在测试中,我正在检查是否调用了服务,并且data1,data2是否未定义。

it('check if qService' got called, function() {
  expect(scope.data1).toBeUndefined();
  rootScope.$digest();
  expect(_quoteService.getQuote).toHaveBeenCalled();
});
it('check if "data1" is defined', function () {
  expect(scope.data1).toBeUndefined();
  rootScope.$digest();
  expect(scope.data1).toBeDefined();
});

我的问题是,这是工作的罚款,直到我取代与q.all控制器和测试我个人的服务电话scope.$applyrootScope.$digest。使用q.all和rootScope.$digest(也尝试使用scope.$apply),两个测试均失败,并显示以下错误:

达到10个$ digest()迭代。流产!

如果我删除了,rootScope.$digest那么承诺永远不会得到解决,而测试失败了

预期未定义。

任何帮助我应该如何对代码进行单元测试q.all

碰到这篇文章

但这也无济于事,因为我已经在尝试使用$digest


问题答案:

你可以尝试把$rootScope.$apply()afterEach()回调函数。承诺$apply()在Angular中解决。

afterEach(function(){
    rootScope.$apply();
});


 类似资料:
  • 问题内容: 我正在尝试编写业力/茉莉花测试,我想对模拟如何在正在返回诺言的服务上工作进行一些解释。我解释一下我的情况: 我有一个控制器,在其中执行以下调用: 这是我的服务方式: 最后,这是我的单元测试: 我真正想做的是将响应对象({“ elements:…})作为fillMapDatas函数的datas参数。我不了解如何模拟所有服务内容(服务,承诺,然后) 问题答案: 因此,如果您的服务是否按预期

  • 我需要用jasmine对一些DOM操作函数进行单元测试(目前我在浏览器和Karma中运行测试) 我想知道最好的方法是什么? 例如,我可以模拟和存根窗口,记录对象和spyOn的几个函数。但这看起来并不是一个简单的解决方案,所以我要问这个问题! 或者有没有更好的方法(也许不用茉莉花)来做到这一点? 非常感谢

  • 我使用文件在 Webstorm 8.0.4 中设置了茉莉花集成 这与语法突出显示的工作方式一样,我可以跳转到声明,文档显示正确。所以连接看起来很好。然而,JSHint仍然为每个关键字抱怨它没有被定义,例如 另请参见以下屏幕截图。正如您所看到的,语法突出显示很好,但我仍然收到一个错误。

  • 我有这个错误的麻烦。我想我忘记了一些东西,无法弄清楚是什么。任务很简单:只需测试我的简单组件。在这里,我们去: 和测试: 和HTML: 这个错误: 需要undefined等于['big','primary theme color']。错误:需要undefined等于['big','primary theme color']。位于UserContext。(http://localhost:9876/

  • 我正试图写一个Jasmine测试来覆盖一个Twitter Boostrap模态对话框。当调试器行被注释掉时,测试失败。当调试器暂停处理并且我继续时,它通过。我认为引导模式的转换导致了这个问题,因为在我进行expect调用时,模式对话框还不在DOM中。 如何在测试期间禁用转换? 谢谢 感谢Jarred,您的解决方案非常有效!这是我的工作测试:

  • 问题内容: 我正在使用茉莉花对angularjs控制器进行单元测试,该控制器在范围内将变量设置为调用返回promise对象的服务方法的结果: 服务内部: 在我的angularjs应用程序上下文中,这可以正常工作,但在茉莉花单元测试中则无法工作。我已经确认“ then”回调在单元测试中正在执行,但是$ scope.myVar承诺永远不会设置为回调的返回值。 我的单元测试: 另外,如果我将控制器更改为