gpt4 book ai didi

javascript - 能否在 TDD 方法中淘汰和删除冗余测试?

转载 作者:行者123 更新时间:2023-11-28 20:20:30 25 4
gpt4 key购买 nike

我有两个函数,foobar

function foo() {
if (arguments.length !== 1) {
throw new TypeError('only one argument expected');
}

do work;
}

function bar() {
if (arguments.length !== 3) {
throw new TypeError('exactly three arguments expected');
}

do work;
}

这些函数是根据 TDD 创建的——例如首先编写测试,然后实现功能以使测试通过。测试列表:

  1. foo() 已定义
  2. foo() 做正确的事
  3. foo() 当参数数量错误时抛出 TypeError
  4. bar() 定义
  5. bar() 做对了
  6. bar() 当参数数量错误时抛出 TypeError

如您所见,这些函数都具有复制功能——它们各自测试参数的正确性。由于此检查在我的函数中将非常常见,并且可能会变得更加复杂(检查参数计数是否在某个范围内,检查参数类型等),我决定将其移出到单独的装饰器函数中 检查

所以我为 check 编写了测试并实现了 check 本身。

现在是重构步骤 — 我利用了 check,所以函数现在看起来如下:

foo = check(1, function() {
do work;
});

bar = check(3, function() {
do work;
});

我现在应该做什么来检查 foo()bar() 接受正确数量的参数的测试?我可以放下它们吗?

当我实现函数 buzz() 时,它会立即使用 check()(因为它现在用作定义函数的方式),我是否必须编写测试它是否接受正确数量的参数?我在犹豫,因为这个测试总是绿色的,因为所有的工作都是在装饰器中完成的,所以还有测试的必要吗?

最佳答案

我会避免保留检查相同代码的多个单元测试,因为将来:

  1. 如果您故意以破坏测试的方式更改 check 函数,则必须更改 2 个测试而不是一个。
  2. 如果你无意中破坏了check,你会得到两个错误:一个引用foo,一个引用bar,并且它损坏的是 check 功能并不明显。

所以,我会只保留一组测试,明确命名为 check 函数的测试,更好的是,不要使用程序的函数来测试它们(不是 foo 在您的示例中既不是 bar ),而是使用仅用于测试目的的假函数。

通过这种方式,您可以在将来更改 foobar 以使用,例如,一个 check2 函数,而无需对 check 函数进行中断测试

根据我的说法,这是最好的理论方法,但要务实:如果你不希望在一个很好的情况下使用 check 函数,请不要尝试遵循这种方式您的代码的一部分:您的目标必须让主程序顺利运行,而不是一组漂亮的测试......

关于javascript - 能否在 TDD 方法中淘汰和删除冗余测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21501331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com