如何使用sinon模块模拟axios请求

时间:2019-07-04 05:12:20

标签: javascript node.js axios sinon sinon-chai

似乎有很多不同的方法可以执行此操作,但是我试图仅使用sinon,sinon-test,chai / mocha,axios,httpmock模块。我无法成功模拟使用axios进行的GET调用。我希望能够模拟来自该axios调用的响应,以便单元测试实际上不必发出外部API请求。

我尝试通过创建沙箱并使用sinon存根建立GET调用并指定期望的响应来设置基本单元测试。我不熟悉JavaScript和NodeJS。

// Main class (filename: info.js)

function GetInfo(req, res) {
    axios.get(<url>).then(z => res.send(z.data));
}

// Test class (filename: info.test.js)

it ("should return info", () => {
    const expectedResponse = "hello!";
    const res = sinon.spy();
    const aStub = sinon.stub(axios, "get").resolves(Promise.resolve(expectedResponse));

    const req = httpMock.createRequest({method:"get", url:"/GetInfo"});

    info.GetInfo(req, res);

    // At this point, I need to evaluate the response received (which should be expectedResponse)
    assert(res.data, expectedResponse); // data is undefined, res.status is also undefined

    // How do I read the response received?

});

我需要知道如何读取应该发回的响应(如果正由sinon捕获)。

2 个答案:

答案 0 :(得分:0)

我假设您要检查的响应是将z.data传递给res.send(z.data)

我认为您的Sinon Spy设置不正确。

在您的示例中,res是sinon创建的函数。此函数没有属性data

您可能想要创建这样的间谍:

const res = {
  send: sinon.spy()
}

这将为您提供一个res对象,该对象具有一个带有键send的间谍。然后,您可以对用于调用res.send

的参数进行断言
it ("should return info", () => {
    const expectedResponse = "hello!";
    const res = {
      send: sinon.spy()
    };
    const aStub = sinon.stub(axios, "get").resolves(Promise.resolve(expectedResponse));

    const req = httpMock.createRequest({method:"get", url:"/GetInfo"});

    info.GetInfo(req, res);

    // At this point, I need to evaluate the response received (which should be expectedResponse)
    assert(res.send.calledWith(expectedResponse)); // data is undefined, res.status is also undefined

});

答案 1 :(得分:0)

不知道这是否有帮助,但您可能没有得到正确的响应,因为 resolves 是一个带有 Promise 包装的返回。

因此,通过使用 resolves 并在其中包含一个 Promise.resolve,您实际上是在返回 Promise 包装中的 Promise。

也许您可以尝试将代码更改为下面的代码。

const aStub = sinon.stub(axios, "get").resolves(Promise.resolve(expectedResponse));

const aStub = sinon.stub(axios, "get").resolves(expectedResponse);