我可以在没有完成真正实现的情况下调用完成吗?

时间:2014-11-07 16:17:02

标签: ajax jasmine karma-jasmine mockjax jasmine2.0

我正在编写一些茉莉花测试并使用mockjax来模拟我的ajax调用。 我知道茉莉需要一些额外的工作来让它异步工作,但我不喜欢我的解决方案。

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

所有示例似乎都使用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传递到我的viewmodel。

2 个答案:

答案 0 :(得分:1)

在您打开的Github issue中发布答案之后,我从未接受过这样的回答,但下面的代码是我通常在测试中看到的情况。请注意,您可能还希望从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
        });
    });
});

答案 1 :(得分: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();
    });