涵盖分支案例的单元测试

时间:2019-03-05 23:08:41

标签: node.js unit-testing mocha

我正在尝试使用Mocha为.js以下编写单元测试

@Lazy
@Repository
public class JustAClassThatPerhapsCompiles {

    private final String myProp; 
    private final Environment env;

    public JustAClassThatPerhapsCompiles(Environment env, 
                                         @Value("${app.my.prop}") String myProp) {
      this.env = env;
      this.myProp = myProp;
    }

    void justAFuncThatSomebodyWillTryToCompileMaybe(){
        env.getProperty("app.my.prop"); //env should no longer be null
        System.out.println(myProp); //myProp should no longer be null
    }
}

在单元测试中,我试图涵盖环境和默认值中“ valueToUse”的情况。 我试图了解如何涵盖两种单元测试方案。如果我在加载模块之前(使用require)设置了process.env.Var1Value,它涵盖了第一种情况,但没有其他情况;反之,如果我没有设置env变量,则涵盖了另一种情况,因为模块是只能加载一次...我应该如何进行涵盖这两种情况的单元测试?预先感谢!

1 个答案:

答案 0 :(得分:0)

让我们假设您的当前启动代码确实必须在启动时计算。然后,您将获得一些解决方案,其中可执行文件会多次启动,例如从Shell脚本启动。然后可以通过某些命令行参数将要执行的测试传递到测试的main函数。这是可能的,但通常不必这样做。

另一种选择是将启动代码转换为可以在测试代码的控制下重新执行的代码-例如,以某种init()函数的形式来计算全局/静态值变量。对于启动生产代码而言,这不会对性能产生重大影响,并且在生产代码中,init()函数实际上只会被计算一次。对于运行时性能,根本没有任何损失。但是,对于单元测试,这带来的好处是您可以根据需要多次调用init()

您可以进一步将valueToUse的计算包装到其自身的函数中,以便init()调用此函数以设置valueToUse的值。令人高兴的是,此功能也可以通过单元测试进行单独测试。同样,在启动过程中只会对性能造成轻微影响,而在执行过程中不会。

所有这些都是折衷方案:您也无法将变量分类为const等。但是,这就是为什么有一个称为“可测试性设计”的概念的原因:因为可测试代码有时看起来与未设计的代码不同可测试性。