茉莉花在电话会议之后但是在预期之前解决了承诺

时间:2015-06-15 17:37:42

标签: jasmine

为了测试我的控制器,我使用$ 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

1 个答案:

答案 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();
});

我必须说我不认为进行摘要调用会产生很大的开销,如果其他程序员在不理解其代码的情况下使用您的代码,您可能会遇到上述建议的麻烦。