2016-08-11 2 views
0

, поэтому я хочу протестировать метод «getTheValues», который вызывает вызов Ajax. Я высмеивал ответ сервера со значениями, но когда я запускаю тест, я получаю два отказа, но не объясню, почему они потерпели неудачу. Что я здесь делаю неправильно?Проверка QUit: как проверить ответ вызова Ajax в рамках метода?

test("Test - call Ajax within method.", function() { 
var callback = sandbox.spy(); 
server.respondWith("GET", "/ajaxtest/getmethod", 
        [200, { "Content-Type": "application/json" }, 
        '[{ "id": 123, "name": "John" }]']); 

getTheValues(); 
server.respond(); 

ok(callback.calledOnce, "Callback was called once"); 
ok(callback.calledWith([{ id: 123, name: "John" }]), "Callback with correct values."); 
}); 

function getTheValues(callback) { 
// do some stuff including an ajax call: 

$.ajax({ 
    type: 'GET', 
    dataType: 'json', 
    cache: false, 
    url: '/ajaxtest/getmethod', 
    success: function(data) { 
    } }); 
} 
+0

Нам, вероятно, необходимо знать, что говорят об ошибках, прежде чем мы сможем помочь ... что возвращает qunit? Просто посмотрев на код, я бы предположил, что обработчик 'success' называет что-то, называемое« песочница »? Честно говоря, не уверен. – jakerella

ответ

0

сначала (рабочий) Код:

QUnit.module('Test Module', { 
    before: function() { 
    this.server = sinon.fakeServer.create(); 
    }, 
    after: function() { 
    this.server.restore(); 
    delete this.server; 
    } 
}); 

QUnit.test("Test - call Ajax within method.", function (assert) { 
    var callback = sinon.spy(jQuery, "ajax"); 
    this.server.respondWith("GET", "/ajaxtest/getmethod", /*?id=123&name=-John*/ 
    [200, { "Content-Type": "application/json" }, 
     '[{ "id": 123, "name": "John" }]']); 

    var a = getTheValues(); 
    this.server.respond(); 

    assert.ok(callback.calledOnce, "Callback was called once"); 
    var callArgs = callback.args[0][0]; 
    assert.equal(JSON.stringify(callArgs.data), JSON.stringify({ "id": 123, "name": "John" })); 
}); 


function getTheValues() { 
    // do some stuff including an ajax call: 

    $.ajax({ 
    data: { id: 123, name: "John" }, 
    method: 'GET', 
    dataType: 'json', 
    cache: false, 
    url: '/ajaxtest/getmethod', 
    success: function (data) { 
    } 
    }); 

Следующие объяснения

  1. это мне кажется это не чистый тест QUnit. Я предполагаю, что вы тоже используете SinonJS.

  2. на методе шпиона вам нужно указать, что будет шпионил

    sinon.spy (JQuery, «Аякса»)

  3. вы не можете использовать callback.calledWith, как это для него возвращается истина/ложь и сравнение объектов ({} === {}) будет (почти) всегда возвращать false. Таким образом, этот тест будет постоянно терпеть неудачу. Вместо этого вам нужны аргументы шпиона (в вашем случае callback.args [0] [0];) и сравнить определенную часть с желаемым результатом. Подробнее об этом вы могли бы find here На самом деле вам не нужно извлекать их, но я сделал это, чтобы сделать код (надеюсь) более понятным.

Так

  • 1-аргументы экстракт,
  • Следующие strignify объекты сопоставимы без любого другого кода и
  • затем используют равный метод сравнения с ожидаемыми значениями

И, наконец, ваш фиктивный объект не имеет объекта данных с w плохой отправьте вместе с запросом GET.

HTH

Смежные вопросы