为了测试我的控制器,我使用$ q注入模拟了一些服务。这些将酌情拒绝或解决承诺。我的测试依赖于间谍来监视函数是否被调用。
我已经发现我需要调用$ rootScope。$ digest()如果我在函数调用后将它包含在测试中,它可以工作,但它是多余的,我是害怕我有时会在测试中忘记它。
如果我尝试将摘要调用移至afterEach,则承诺实际上并未解决!
尝试使用下面的内容,它嵌套在我所有的beforeEachs的测试的父级中:
afterEach(function () {
$rootScope.$apply();
});
然后是我的测试,其描述与我之前/之后的范围相同:
it("on return success from personService.add, state.go called", function () {
$scope.addPerson(true);
expect($state.go).toHaveBeenCalled();
});
如果我按上述方式运行,则不会调用该函数。但是,如果我在调用addPerson之后添加$ rootScope。$ digest(),则会调用它!
1)如何在函数调用之后但在我期望
之前全局解析promises答案 0 :(得分:1)
each
中的afterEach/beforeEach
是指it
方法。这意味着您不能期望在it
部分调用函数,在afterEach
中消化范围,并且仍然在expect
方法中使用it
。
如果你害怕你会忘记运行摘要,你可以将你的函数调用包含在一个私有函数中,该函数会为你处理它,就像那样:
describe(...., function () {
....
function doAct(func) {
if (typeof func === "Function") {
func();
$rootScope.$digest();
}
}
// it methods here
});
只需对这些特定的规范测试进行包装调用:
it("on return success from personService.add, state.go called", function () {
doAct(function () {
$scope.addPerson(true);
});
expect($state.go).toHaveBeenCalled();
});
我必须说我不认为进行摘要调用会产生很大的开销,如果其他程序员在不理解其代码的情况下使用您的代码,您可能会遇到上述建议的麻烦。