Mockjax在同一个测试文件中两次?

时间:2013-02-08 20:23:28

标签: javascript unit-testing qunit mockjax

使用Qunit和MockJax,我试图进行两次测试,这里为了便于理解而简化。以下两个测试中的一个失败,大概是因为两个测试并行运行,因此他们不会自己绕过$.ajax()。 (唯一的区别是每个中的responseText。)有什么好的方法来调整它以便以下测试通过?

function testAjax() {
    return $.ajax({
        type: 'POST',
        dataType: 'json', 
        url: '/fakeservice/1',
        data: {'a':'b'}
    });
}

asyncTest("testAjax 1", function () {
    $.mockjax({
        url: '/fakeservice/1',
        type: 'POST',
        dataType: 'json',
        responseText: { 'name1': 'foo' }
    });

    testAjax().then(
        function (response) {
            deepEqual(response.name1, 'foo', "no name1");
            start();
        },
        function (error) {
            ok(false, "got AJAX error");
            start(); 
        }
    );
});


asyncTest("testAjax 2", function () {
    $.mockjax({
        url: '/fakeservice/1',
        type: 'POST',
        dataType: 'json',
        responseText: { 'name1': 'bar' }
    });

    testAjax().then(
        function (response) {
            deepEqual(response.name1, "bar", "no name1");
            start();
        },
        function (error) {
            ok(false, "got AJAX error");
            start();
        }
    );
});

1 个答案:

答案 0 :(得分:3)

您必须在每次测试结束时致电$.mockjaxClear()(例如,在模块的teardown()方法中)。这会摧毁模拟并为下一次测试做好准备。

function testAjax() {
    return $.ajax({
        type: 'POST',
        dataType: 'json', 
        url: '/fakeservice/1',
        data: {'a':'b'}
    });
}

module("AJAX tests", {
    teardown: function() {
        $.mockjaxClear();
    }
});
asyncTest("testAjax 1", function () {
    $.mockjax({
        url: '/fakeservice/1',
        type: 'POST',
        dataType: 'json',
        responseText: { 'name1': 'foo' }
    });

    testAjax().then(
        function (response) {
            deepEqual(response.name1, 'foo', "no name1");
            start();
        },
        function (error) {
            ok(false, "got AJAX error");
            start();
        }
    );
});


asyncTest("testAjax 2", function () {
    $.mockjax({
        url: '/fakeservice/1',
        type: 'POST',
        dataType: 'json',
        responseText: { 'name1': 'bar' }
    });

    testAjax().then(
        function (response) {
            deepEqual(response.name1, "bar", "no name1");
            start();
        },
        function (error) {
            ok(false, "got AJAX error");
            start();
        }
    );

});

请参阅your adapted example on jsFiddle