如何触发Angular测试中的解决承诺?

时间:2016-03-05 05:30:38

标签: javascript angularjs unit-testing karma-runner

if (isPromise(self.parentId)) {
  console.log('DEBUG: outside then');
  self.parentId.then(function (parent) {
    console.log('DEBUG: inside then');
    self.parentId = parent.id;
    self.notes = Note.query({
      parent_type: self.parentType,
      parent_id: self.parentId,
    });
  });

我想测试Note.queryself.parentId时调用promise

it('when a promise is passed in', function () {
  $controller('NotesController', {}, {
    parentId: Lead.get({ id: 1 }).$promise,
    parentType: 'leads',
  });
  expect(Note.query.called).to.equal(true);
});

这不起作用。外部日志发生,但内部日志不会发生。所以可能是问题在于承诺没有解决。

1)为什么这不起作用? 2)我怎样才能让它发挥作用?

1 个答案:

答案 0 :(得分:0)

为了测试承诺,你需要在你的承诺返回功能上创建间谍。然后用一些模拟数据解决这个问题。 首先在测试中注入$ q。

deferred = _$q.defer();
spyOn(self, 'parentId').and.returnValue(deferred.promise);
deferred.resolve({ id: 102 });
$scope.$apply();

这应该可以解决你的承诺。根据您的要求更改字段名称只是样本