【问题标题】:Sinon FakeServer no requests?Sinon FakeServer 没有请求?
【发布时间】:2016-10-18 16:59:00
【问题描述】:

我正在关注 SinonJS Fake Server tutorial,我正在运行这个简单的代码:

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({ 失败。有人对此有任何想法吗?

【问题讨论】:

  • 您似乎只是逐字复制了示例。无法想象出了什么问题。
  • @RobertMoskal 我认为这可能是我如何获取 jQuery 的问题。您通常如何将其导入到这样的文件中?
  • 嗯,你可能是对的。稍后我将研究我的一个项目,在那里我进行了类似的测试。
  • 仍然看起来或多或少正确,但确实没有加载 jquery 可能是个问题。如果你在 getTodos 中使用 console.log($) 会发生什么?
  • @RobertMoskal 它返回一个大函数,所以肯定有东西。

标签: jquery unit-testing reactjs mocha.js sinon


【解决方案1】:

我能想到的一个问题是您没有在 JSDom 实例中加载 Sinon。这是一个在这里工作的测试文件:

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);
});

【讨论】:

  • 有点冗长,但它有效!谢谢你。我认为只做var sinon = require('sinon'); 就足够了。
  • 现在我正在尝试在另一个 React 组件(不同的文件)中测试一个函数,但我遇到了同样的错误。我很确定我已将 Sinon 加载到我的 JSDo 实例中。你知道出了什么问题吗?
  • 问一个新问题是要做的事情。社区并没有很好地看到可回答的问题在被回答后被修改。我看到你已经问了一个新问题。我已在此处回滚您对问题的编辑,因为根据 Stack Overflow 编辑惯例,它不属于此处。我会看看你的新问题。
猜你喜欢
  • 2016-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
  • 2012-06-29
  • 1970-01-01
相关资源
最近更新 更多