【问题标题】:Different outcomes for a single stub单个存根的不同结果
【发布时间】:2021-07-13 05:15:06
【问题描述】:

我使用Sinon 在单元测试期间对一些数据检索方法进行存根。大多数这些数据方法都是异步的,所以resolves 语法到目前为止已经很方便了。我想要实现的是基于Math.random() 动态生成不同的测试数据,以自动覆盖我代码上的不同分支,而无需实际为每种情况提供硬编码的示例输入数据。尽管如此,我已经意识到存根实际上只是在初始化时被调用一次,而不是它的返回值在测试过程的执行过程中得到固定/恒定(基于Mocha)。有没有办法为单个存根使用提供不同的结果?我检查了 onCall 语法,但它也提供固定输出,只能根据当前迭代索引进行选择,但不是实际的动态输出,它甚至可能是基于 args/params 的。

欢迎所有想法!

使用 Sinon 进行当前存根:

sinon.stub(dynamodb, 'get').resolves(stubGet())

存根本身:

function stubGet () {
  // Choose random repo
  const i = Math.round(Math.random() * sampleData.length)
  const repo = sampleData[i]

  // Should it have "new code/push date"?
  const isNew = Math.round(Math.random()) === 1
  if (isNew) {
    repo.pushed_at = { S: '1970-01-01T00:00:00Z' }
  }

  console.log('repo', repo)
  const item = { Item: repo }
  console.log(item)
  return item
}

目标是希望获得随机的repoisNew 值。

【问题讨论】:

    标签: javascript unit-testing tdd sinon stub


    【解决方案1】:

    随机性是不可预测的。测试代码应该是可预测的,包括测试数据。否则,有一天你的测试可能会因一些随机数据而失败

    我们应该编写多个测试用例,每个测试用例使用固定的、尽可能简单的测试数据来测试代码的每个分支、场景等。断言返回的值是否符合您的期望。

    您应该使测试代码、测试数据可预测。欲了解更多信息,请参阅Unpredictable Test Data

    【讨论】:

    • 我同意,但一定程度的数据突变对于提供非标准场景也很有用,因为对此类更改有适当的控制,这就是我在这里想要实现的目标
    • @gvasquez 你应该自己控制存根的值,而不是依赖随机。从代码中,我没有看到你应该使用随机数据的任何理由
    猜你喜欢
    • 1970-01-01
    • 2017-07-13
    • 2021-10-12
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    相关资源
    最近更新 更多