Могу ли я вызвать выполненное без передачи выполненного в мою реальную реализацию?

Я пишу несколько тестов с жасмином и использую mockjax для макетирования моих вызовов ajax. Я знаю, что жасмин требует дополнительной работы, чтобы заставить его работать асинхронно, но мне не нравится мое решение.

Я прохожу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
    });
}

Я все об этом ошибаюсь?

Просто чтобы повторить, я хочу, чтобы Жасмин знала, когда mockjax / ajax -.done() без передачи done из жасмина в мою модель зрения.

2 ответа

Я никогда не отвечал на этот вопрос после публикации ответа в проблеме 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
        });
    });
});

Поскольку Джакерелла был достаточно любезен, чтобы дать ответ, я решил, что я должен также показать, как я решил проблему здесь, я выбрал решение, которое он предоставил мне на 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();
    });
Другие вопросы по тегам