Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 如何在BDD下有效地使用case语句进行单元测试?_Unit Testing_Bdd - Fatal编程技术网

Unit testing 如何在BDD下有效地使用case语句进行单元测试?

Unit testing 如何在BDD下有效地使用case语句进行单元测试?,unit-testing,bdd,Unit Testing,Bdd,我对单元测试比较陌生,并且已经开始关注这样一个事实:当我有case语句时,我的测试代码的数量使我的生产代码相形见绌,其中某些对外部函数的调用是重复的,但参数不同,结果也不同。在我提出问题之后,如果一个名为calculateDeltas的公共函数的javascript伪代码格式不正确,请道歉。在下面的代码中,populateDeltas是一个私有函数,我正在通过calculateDeltas的测试间接测试它 我正在努力解决的问题如下: 1.我正在用4种不同的方法测试CalculateDelta,以

我对单元测试比较陌生,并且已经开始关注这样一个事实:当我有case语句时,我的测试代码的数量使我的生产代码相形见绌,其中某些对外部函数的调用是重复的,但参数不同,结果也不同。在我提出问题之后,如果一个名为calculateDeltas的公共函数的javascript伪代码格式不正确,请道歉。在下面的代码中,populateDeltas是一个私有函数,我正在通过calculateDeltas的测试间接测试它

我正在努力解决的问题如下: 1.我正在用4种不同的方法测试CalculateDelta,以覆盖4个不同的分支。 2.这样,我有效地测试了3次populateDeltas。对于每个测试的PopulateDelta都有一些断言,这些测试实际上是用不同的参数重复3次。 3.我的一个想法是在隔离状态下测试大众埃尔塔。在这种情况下,我现在不是在测试实现吗?更重要的是,如果我从来没有将整个函数calculateDeltas作为一个整体进行测试,我怎么知道整个函数是如何工作的? 4.即使这是一个好主意,如何简化我的CalculateDelta测试?我想我会以某种方式验证populateDeltas是否被调用。 5.在这种情况下,我如何验证calculateDeltas的输出是否是我在调用它的上下文中实际期望的结果? 6.换句话说,我如何知道calculateDeltas在没有对私有函数运行集成测试的情况下工作? 7.这难道不违反BDD的精神吗?BDD的精神是保护外部行为,而不是内部行为,而populateDeltas代表内部行为,而calculateDeltas代表外部行为

谢谢你的帮助,我有点迷路了。代码如下:

function calculateDeltas(){
  var deltas = {status: this.rowStatus};
  switch(this.rowStatus){
    case 'new':
      this.populateDeltas(deltas, 'new');
      return deltas;
    case 'changed':
      deltas.key = this.key();
      this.populateDeltas(deltas, 'changed');
      return deltas;
    case 'unchanged':
      deltas.key = this.key();
      this.populateDeltas(deltas, 'unchanged');
      return deltas;
    case 'deleted':
      deltas.status = 'deleted';
      return deltas;
}
在下面的代码中,populateDeltas是一个私有函数,我正在通过calculateDeltas的测试间接测试它

这常常令人困惑

需要注意的是,私有不是一个必要的工具。公共活动很好。真正地Python人非常高兴没有任何隐私。我们都是成年人

这难道不违反BDD的精神吗?BDD的精神是保护外部行为,而不是内部行为,而populateDeltas代表内部行为,而calculateDeltas代表外部行为

虽然BDD专注于外部行为,但您做出了创建私有共享函数的实现决策

您仍然可以执行BDD并测试这个私有的共享函数。只需测试所有四个案例。外部接口依赖于此内部接口

如果你想测试内部,没关系。这不是BDD,这只是个好主意

在BDD这一好想法的最低基线之上,有可能有好的想法。您可以添加到BDD,因为您可以在此处选择实现

换句话说,我如何知道calculateDeltas在没有对私有函数运行集成测试的情况下工作


这是一个相当愚蠢的问题。想得太多了。只需测试外部接口。如果外部函数使用内部私有函数,则外部测试将在正常事件过程中测试内部函数。

编写多个测试以覆盖所有场景没有错


如果您担心的是对核心逻辑的过度测试,那么case语句的一种方法是用策略模式替换条件逻辑。在这个场景中,我将有一个类来处理每个场景的逻辑,然后将它们放在一个查找表中。最后的代码只是根据行状态执行处理程序。您可以轻松地测试此逻辑一次,然后为每个处理程序编写特定的测试

除了对最后一段和你的一般性建议感到困惑外,我什么都听懂了。通过测试外部函数,calculateDeltas,我认为这是需要完成的,因为这是我试图锁定的行为,我遇到了问题,因为我的测试基本上是每次调用内部填充的Eltas函数时“重新测试”一次,这就是我试图避免或以更合适的方式处理的。也许我缺少一种技巧?@glenn I:你为什么要避免重新测试?怎么了?我在重新测试,这就是我担心的地方。这只是导致我的测试代码与我的生产代码相比非常大。我读过类似于1或2:1的比率,我已经读过了,所以我很确定我做错了什么。@glenn I:在OO语言中,您可以在测试用例中使用继承来重用代码。还有1或2比1的比率,我已经超过了,这并不意味着什么。有些东西很小,很复杂,需要仔细测试。有些东西是大哑巴,或多或少可以通过检查来测试。使用继承。我会测试它,但是你可以 然后重构CalculateDelta。它有大量的重复。为了消除重复,您可能需要重新考虑对象。此外,如果使用依赖项注入,则可以模拟rowStatus,而不是将CalculateDelta依赖于rowStatus设置在外部某处。在这些重构之后,如何测试应该变得更加明显。