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

Node/Mocha:如何测试调用外部API的包装方法

濮阳振
2023-03-14

我最近开始编写单元测试,并开始转向集成测试。我有这个相当简单的方法,但我有点迷失在如何接近,甚至如何准确地测试它。

list (token, cb) {
  const requestArgs = {
    headers: { 'Authorization': `Bearer ${token}` },
    method: 'GET',
    uri: `${BASE_URL}/rest/V1/modules`,
    json: true
  }

  request(requestArgs, (err, msg, resp) => {
    if (err) {
      return cb(err) // library error
    }
    return cb(null, resp)
  })
}

通过阅读各种文章和Sinon文档,听起来我可能需要为request()?即使我用一个好的响应伪造了外部API调用,但如果它总是返回一个好的响应,那又有什么好处呢?因为这个方法所做的一切都是将requestArgs放在一起,并返回外部调用的响应。我对术语“stub”、“spy”和“mock”以及我需要为这个包装器方法做什么感到困惑。

共有1个答案

訾淇
2023-03-14

有关模拟、存根和间谍对象之间的差异,请参见此SO问题。

有人能解释一下Spock框架测试中Mock、Stub和Spy之间的区别以及何时使用它们吗?

在单元测试中,您应该始终将测试范围限制在正在测试的特定单元。在你的例子中,我会存根“请求”函数,并返回我希望在不同场景中返回的任何数据。

这种方法有很多优点,包括加快测试速度。访问外部资源通常很耗时。此外,由于您的测试范围已缩小到更小的范围,因此更容易查明问题。

如果您的测试范围包括多个单元,那么这将被视为集成测试。集成测试旨在检查不同单元之间的通信流以及它们之间的数据流。

即使我用一个好的响应伪造了外部API调用,如果它总是返回一个好的响应又有什么好处呢

您应该在尽可能多的不同场景中测试您的单元,以确保您的代码在您可能遇到的每种情况下都能正确运行。

在每个场景中,您都在回调函数中收到正确的参数吗?是否返回错误?

将测试视为代码的实时文档。测试应该描述代码应该做什么。

例如,如果另一个开发人员做出了突破性的更改,或者您在重构代码时意外引入了一个bug,那么您的测试应该能够捕获它。

 类似资料:
  • 问题内容: 我正在使用JavaScript测试运行程序“摩卡”。 我的测试失败了,因此我将使用进行调试。 但是运行测试时,没有输出(仅来自Mocha的测试结果)。看来Mocha已捕获并抑制了我的输出! 如何让Mocha显示输出?(对于失败的测试)? 编辑: 抱歉!- 在测试期间可以正常工作!我肯定一直期望它抑制输出,而且我没有正确检查自己的代码。感谢您的回应。所以…话虽如此…也许抑制通过测试的输出

  • 要运行Mocha的测试,您需要GNU Make或兼容; Cygwin应该工作。 $ cd /path/to/mocha $ npm install $ npm test 要使用其他记者: $ REPORTER=nyan npm test

  • 我有一个模块,它调用一个使用bluebirdpromise的方法。这是简化的模块。Cassandra只是一些db调用的包装器,它保证了它们: 我正试图用西农和西农蓝鸟来测试这一点。我取消了Cassandra的查询promise,并让res.sendStatus成为间谍: 我认为使用这些库,存根的then()将被立即调用,而不是异步调用,但情况似乎并非如此。确实调用了res.sendStatus()

  • 问题内容: 设置:我有一个用TypeScript编写的Node项目(纯Node,没有浏览器位)。我可以使用模块中的TypeScript编译器()来编译代码。到目前为止,一切都很好。 但是,我想使用Mocha编写测试,这就是我遇到的麻烦。我尝试了,但是不断出现以下错误: 看起来命令行最终被传递给,这显然不好。 问题答案: 对于任何尝试过 typescript-require 并遇到问题的人,您都可以

  • 我必须为一个调用API然后处理响应的类编写测试。类有两个公共函数和一个私有函数。第一个公共方法获取ID列表。在循环中为每个ID调用第二个公共方法,以获取与ID关联的详细信息。私有方法是在第二个公共方法内部调用的,因为获取基于id的详细信息的调用是异步进行的。 我是JUnits的新手,虽然我知道我不应该测试API调用,只是测试我的函数,但我仍然不明白单元测试应该断言什么。