1

我正在编写一些 jasmine 测试并使用 mockjax 来模拟​​我的 ajax 调用。我知道 jasmine 需要一些额外的工作才能使其异步工作,但我不喜欢我的解决方案。

我将 ' done' 传递到我的实际实现中,然后在我的 ajax 请求的承诺中调用它。

所有示例似乎都使用 setTimeouts 作为“模拟”,在我看来这并不完全有帮助。

这里有一些代码可以帮助理解:

茉莉花

    $.mockjax({
        url: "*/api/AdminBenefits",
        contentType: "application/json",
        type: "post"
    });

    beforeEach(function (done)
    {
        vm.benefit.benefitName(expectedBenefitName);
        vm.addBenefit(done); <---- Dirty
    });

    //Assert
    it('should toast success', function (done)
    {
        expect(fakeToastr.successValue()).toEqual('"' + expectedBenefitName + '"' + " was added successfully.");
        done();
    });

执行

model.addBenefit = function(callback) <---- Dirty
{
    var value = model.benefit.benefitName();

    $.ajax({
        url: rootPath + "/api/AdminBenefit",
        dataType: "text",
        contentType: "application/json",
        type: "post",
        data: ko.toJSON(model.benefit)
    }).done(function(data) {
        toastr.success("\"" + value + "\"" + " was added successfully.");
        !callback || callback(); <---- Dirty
    }).fail(function() {
        !callback || callback(); <---- Dirty
    });
}

我对这一切都错了吗?

只是为了重新迭代,我想让 jasmine 知道什么时候 mockjax / ajax 是 .done() 而无需done从 jasmine 传入我的视图模型。

4

2 回答 2

1

在您打开的Github 问题中发布答案后,我从未跟进此答案,但下面的代码是我通常在测试中看到的实现方式。请注意,您可能还想从源代码中返回一些结果callback(),但前提是您想对该结果数据进行断言(这可能是个好主意)。

测试代码:

describe("Some functionality", function() {
    beforeEach(function ()
    {
        $.mockjax({
            url: "*/api/AdminBenefits",
            contentType: "application/json",
            type: "post"
        });
    });

    it('should toast success', function (done)
    {
        vm.benefit.benefitName(expectedBenefitName);
        vm.addBenefit(function()
        {
            expect(fakeToastr.successValue()).toEqual('"' + expectedBenefitName + '"' + " was added successfully.");
            // possibly other assertions on the result data passed in the callback...

            done(); // tell jasmine you're done with async action
        });
    });
});
于 2014-12-27T22:04:58.110 回答
0

由于 jakerella 很友好地提供了一个答案,我决定我也应该在这里展示我是如何解决这个问题的,我选择了他在 GitHub 上提供给我的解决方案并定义了一个 onAfterComplete。

describe("When clicking the add benefit type button and the server is successful", function () {
    //Arrange
    var expectedBenefit;

    beforeEach(function (done) {
        vm.Reset();
        expectedBenefit = vm.setRandomBenefit();

        $.mockjax({
            url: "*/api/AddBenefitType",
            type: "post",
            onAfterComplete: function () { done(); } //<------
        });

        //Act
        vm.addCurrentBenefit();
    });

    //Assert
    it('should toast success', function (done) {
        expect(toastr.successValue()).toEqual('"' + expectedBenefit.Name + '"' + " was added successfully.");
        done();
    });
于 2014-12-30T16:26:04.917 回答