1

私はいくつかのジャスミン テストを作成し、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
    });
}

私はこれについてすべて間違っていますか?

繰り返しますが、ジャスミンからビューモデルに渡さずに、mockjax / ajax が .done() であることをジャスミンに知らせたいと思いdoneます。

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 に答える