【问题标题】:Unit test: Having trouble mocking a promise return to test my emit单元测试:无法模拟一个承诺返回来测试我的发射
【发布时间】:2016-09-26 15:07:48
【问题描述】:

单元测试:在模拟 promise 返回测试我的发射时遇到问题

我想看看在 promise 回调中是否调用了 emit。

这是我正在测试的代码:

"use strict";

angular.module("app.directives")
    .directive("modalFilter", ["filterValidationService", function(filterValidationService) {
        return {
            restrict: "E",
            scope: {},
            templateUrl: "templates/components/modal-filter.html",
            link: function(scope) {
                let defaultFilter = {"size": {"to": 0, "from": 0}};

                scope.clearFilter = function() {
                    scope.filter = defaultFilter;
                };

                //New - requires unit test
                scope.updateTable = function() {
                    const tab = "availabilities";
                    const isFilter = scope.filter === defaultFilter ? false : true;

                    filterValidationService.validateSize(scope.filter.size)
                        .then(filterObj => {
                            scope.$emit("filter:cardData", filterObj, tab, isFilter);
                        });
                };

                scope.clearFilter();
            }
        };
}]);

这是我的单元测试:

    "use strict";

describe("modal filter component:", function () {
    var element;
    var scope;
    var mockData = {"size": {"to": 0, "from": 0}};
    var mockFilteredData = {"size": {"to": 900, "from": 100}};
    var filterValidationService;

    beforeEach(angular.mock.module("eg.insight.services"));
    beforeEach(angular.mock.module("eg.insight.directives"));

    beforeEach(inject(function ($compile, $injector, $q, $rootScope, filterValidationService) {
        var deferred = $q.defer();
        scope = $rootScope.$new();
        scope.filter = mockData;
        filterValidationService = filterValidationService;

        element = "<modal-filter></modal-filter>";
        element = $compile(element)(scope);

        angular.element(document.body).append(element);

        scope.$digest();
        scope = element.isolateScope();

        sinon.spy(scope, "$emit");

        sinon.stub(filterValidationService, "validateSize").returns(deferred.promise);
    }));

    it("should emit for filtered data when updateTable is called", function () {
        scope.updateTable();
        expect(scope.$emit.calledWith("filter:cardData", mockData.size, "availabilities", false)).toEqual(true);
    });
});

我将 angular1 与 jasmine 单元测试和 sinon 一起使用。

我得到的错误是:“Expected false to equal true”

【问题讨论】:

    标签: javascript angularjs unit-testing sinon


    【解决方案1】:

    我想这可能是因为你在这里返回了一个承诺

    sinon.stub(filterValidationService, "validateSize").returns(deferred.promise);

    但你永远不会解决承诺,所以永远不会调用 .then()

    也许将承诺保存在变量中,并在 scope.UpdateTable() 之后在您的 it() 方法中解决它。

    【讨论】:

    • 会不会像:deferred.resolved(mockData.size);
    • 方法名称是resolve docs.angularjs.org/api/ng/service/$q 您可能需要考虑在您的it() 方法中添加deferred.promise.finally(),然后您将在其中执行expect()
    猜你喜欢
    • 1970-01-01
    • 2016-10-04
    • 2015-03-15
    • 1970-01-01
    • 2014-07-05
    • 2014-05-19
    • 1970-01-01
    • 2014-05-14
    • 2016-05-01
    相关资源
    最近更新 更多