当前位置: 首页 > 知识库问答 >
问题:

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

酆勇
2023-03-14

似乎有很多不同的方法可以做到这一点,但我试图只使用sinon,sinon-test,chai/mocha,axios,httpmock模块。我无法成功模拟使用axios进行的GET调用。我希望能够模拟来自axios调用的响应,这样单元测试实际上就不必发出外部API请求。

我尝试过通过创建沙箱来建立一个基本的单元测试,并使用sinon stub来建立一个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个答案

张翰音
2023-03-14

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

因此,通过使用解析并在其中Promise.resolve,您实际上是在Promise中返回Promise包装。

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

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

const aStub = sinon.stub(axios, "get").resolves(expectedResponse);
慕兴平
2023-03-14

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

我不认为你的Sinon间谍设置正确。

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

你可能想创建一个这样的间谍:

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

这为您提供了一个res对象,其中包含带有密钥发送的间谍。然后,您可以对用于调用 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

});
 类似资料:
  • 问题内容: 我使用sinon作为对nodejs(Hapijs)功能的单元测试。该函数在index.js中。我在我的测试文件中包含index.js作为 但是再次在index.js里面有要求 再次,library.js需要第三方功能 现在,当我在下面运行我的测试文件testfunc.js时 我收到以下错误 我想知道是否有任何方法可以对index.js的内部require库.stub进行存根(因为ind

  • 问题内容: 我开始认为这是不可能的,但是无论如何我都想问。 我想测试我的一个ES6模块以特定方式调用另一个ES6模块。有了茉莉花,这非常容易- 应用程式码: 和测试代码: 笑话相当于什么?我觉得这是一件很想做的简单的事,但是我一直在努力尝试弄清头发。 我最接近的是将s 替换为s,并将其移入测试/函数中。都不是我想做的事情。 为了获得加分,我希望在其中的功能为默认导出时使整个工作正常进行。但是,我知

  • 问题内容: 使用笑话进行测试时,我具有基本的测试服语法: 问题是我的代码中有拦截器,当使用jest命令输出运行测试时,拦截器会: TypeError:无法读取未定义的属性“拦截器” 并指向拦截器对象 是存储以下项的返回值的变量 在SO上引用了该axios线程。我如何以开玩笑的方式测试axios,但是它不涉及任何拦截器,因此并没有真正的帮助。 问题答案: 最后就足够了

  • 我正在编写一些单元测试代码,我想模拟在我的函数中使用的模块:

  • 问题内容: 我的测试目标中当前已导入: 并在我的相同测试目标中使用它: 在测试中,我正在做以下模拟尖锐函数的操作: 但我得到: 有没有一种方法可以使用带有Jest的功能模拟所有Sharp模块功能? 问题答案: 您需要像这样模拟它: 首先,您需要返回function而不是对象,因为您需要调用。该函数调用将返回带有键的对象,该键包含另一个函数,依此类推。 要测试每个功能,您需要为每个功能创建一个间谍。

  • 我在JUnit中使用Mockito,并且我有一个使用RestTemboard向微服务发出请求的方法。 此方法返回一个JSON对象,该对象将在TokenRequestorPayload类中反序列化。 当我执行单元测试时,它们会失败,因为mock不起作用,我得到了一个org.springframework.web.client.ResourceAccessExcure。我怎么能嘲笑我的RestTem板