Sinon FakeServer нет запросов?

Я следую руководству по поддельному серверу SinonJS и запускаю этот простой код:

var server;

before(function () { server = sinon.fakeServer.create(); });
after(function () { server.restore(); });

it("calls callback with deserialized data", function () {
    var callback = sinon.spy();
    getTodos(42, callback);

    // This is part of the FakeXMLHttpRequest API
    server.requests[0].respond(
        200,
        { "Content-Type": "application/json" },
        JSON.stringify([{ id: 1, text: "Provide examples", done: true }])
    );

    assert(callback.calledOnce);
});

Я включаю функцию getTodos в тот же файл. Вот так же:

function getTodos(listId, callback) {
    $.ajax({
         url: "/todo/" + listId + "/items",
         success: function (data) {
             // Node-style CPS: callback(err, data)
             callback(null, data);
         }
    });
}

Однако я получаю сообщение об ошибке TypeError: Cannot read property 'respond' of undefined. Похоже, что server.requests пусто — почему? Как я могу убедиться, что запросы отображаются?

ОБНОВЛЕНИЕ: мне удалось сузить круг проблемы. Я добавил обратный вызов ошибки в функцию getTodos и сделал console.log для ошибки. Оказывается, есть синтаксическая ошибка, исходящая от модуля узла jsdom, пытающегося выполнить urlObj = new URL(uri, documentBaseURLSerialized(this._ownerDocument));, что затем приводит к сбою $.ajax({. У кого-нибудь есть идеи по этому поводу?


person frogbandit    schedule 17.06.2016    source источник
comment
Похоже, вы просто слово в слово скопировали пример. Не могу представить, что не так.   -  person Robert Moskal    schedule 17.06.2016
comment
@RobertMoskal Я думаю, что это может быть проблема с тем, как я получаю jQuery. Как вы обычно импортируете его в такой файл?   -  person frogbandit    schedule 17.06.2016
comment
Хм, возможно, ты прав. Я немного рассмотрю один из своих проектов, где у меня есть такие тесты.   -  person Robert Moskal    schedule 17.06.2016
comment
Все еще выглядит более или менее правильно, но действительно может быть проблемой отсутствие загрузки jquery. Что произойдет, если вы запустите console.log($) в getTodos?   -  person Robert Moskal    schedule 17.06.2016
comment
@RobertMoskal Возвращает большую функцию, так что там определенно что-то есть.   -  person frogbandit    schedule 17.06.2016
comment
Я импортирую jQuery следующим образом: реагировать приложение"> stackoverflow.com/questions/37869307/   -  person frogbandit    schedule 17.06.2016
comment
Давайте продолжим обсуждение в чате.   -  person frogbandit    schedule 17.06.2016


Ответы (1)


Единственная проблема, о которой я могу думать, заключается в том, что вы не загрузили Sinon в свой экземпляр JSDom. Вот тестовый файл, который работает здесь:

var jsdom = require("jsdom");
var assert = require("assert");

var vc = jsdom.createVirtualConsole();
vc.on("log", console.log.bind(console.log));
vc.on("jsdomError", function jsdomError(er) {
    throw er;
});

var window;
var $;
var sinon;
before(function (done) {
    jsdom.env({
        html: "",
        scripts: ["node_modules/jquery/dist/jquery.js",
                  "node_modules/sinon/pkg/sinon.js"],
        features: {
            ProcessExternalResources: ["script"],
            FetchExternalResources: ["script", "link"],
        },
        virtualConsole: vc,
        done: function _done(error, w) {
            if (error) {
                throw error;
            }
            window = w;
            $ = w.$;
            sinon = w.sinon;
            done();
        },

    });
});


function getTodos(listId, callback) {
    $.ajax({
         url: "/todo/" + listId + "/items",
         success: function (data) {
             // Node-style CPS: callback(err, data)
             callback(null, data);
         }
    });
}

var server;

before(function () { server = sinon.fakeServer.create(); });
after(function () { server.restore(); });

it("calls callback with deserialized data", function () {
    var callback = sinon.spy();
    getTodos(42, callback);

    // This is part of the FakeXMLHttpRequest API
    server.requests[0].respond(
        200,
        { "Content-Type": "application/json" },
        JSON.stringify([{ id: 1, text: "Provide examples", done: true }])
    );

    assert(callback.calledOnce);
});
person Louis    schedule 17.06.2016
comment
Немного многословно, но работает! Спасибо. Я думал, что просто сделать var sinon = require('sinon'); было достаточно. - person frogbandit; 18.06.2016
comment
Теперь я пытаюсь протестировать функцию в другом компоненте React (другой файл) и сталкиваюсь с той же ошибкой. Я совершенно уверен, что загрузил Sinon в свой экземпляр JSDom. Вы знаете, что происходит не так? - person frogbandit; 21.06.2016
comment
Задать новый вопрос - это то, что нужно сделать. Сообщество не видит в хорошем свете вопросов, на которые можно ответить, которые изменяются после того, как на них ответили. Я вижу, вы уже задали новый вопрос. Я откатил ваше редактирование к вашему вопросу здесь, потому что, согласно редакционной практике Stack Overflow, он здесь не подходит. Я рассмотрю ваш новый вопрос. - person Louis; 21.06.2016