如何用if else和无返回条件单元测试方法

时间:2016-07-29 18:00:56

标签: unit-testing

我有一个包含以下代码的方法:

ansible-pull

现在doSomething1,doSomething2,doSomething3是无效方法。 如何对myMethod进行单元测试? 例如:如果满足condition1,检查是否调用了doSomething1。

我们可以做些什么来重构这个以使其易于测试?

2 个答案:

答案 0 :(得分:1)

一般方法可能是3个测试用例。每个测试用例都会运行一个条件。对于每个测试用例:

  • doSomethingX将使用测试对象进行修补,(几乎所有语言都有模拟库)
  • 将触发conditionX
  • doSomethingX将执行
  • test会断言doSomethingX实际上被称为

有许多策略可以消除模拟的需要。

如果doSomethingX是一个实例方法,那么您可以创建一个test specific subclass并覆盖doSomethingX并在子类中进行断言。

你也可以重构你的方法,要求调用者注入doSomethingX依赖(依赖注入)

public void myMethod(somethingStrategy)

然后测试可以轻松配置模拟对象并使用模拟对象调用myMethod

依赖注入可以通过class be instantiatedsomethingStrategy来在类级别上进行。

答案 1 :(得分:0)

(a)这些方法无效的事实意味着它们的结果无关紧要,我们只是不在乎。但是你需要测试结果,因此需要知道结果。所以这是一个巨大的红旗,代码不是固定的,需要重构。

(b)嘿,这可能是无法改变的遗留代码,所以如果你的方法真的是空洞,那么下面的重构可能会有所帮助,如果你断言myNewMethod2和doSomething2 / 3被调用一次/不根据条件(例如通过MOQ单元测试框架)调用所有depedndant

    public myNewMethod()
    {
        bool cnd1 = (condition1);
        bool cnd2 = (condition2);
        if(cnd1)
        {
            myNewMethod2(cnd2);
        }
    }

    public myNewMethod2(bool cnd2)
    {
        doSomething1();
        myNewMthod3(cnd2);
    }

    public myNewMethod3(bool cnd2)
    {
        if (cnd2) 
        {
            doSomething2();
        } 
        else 
        {
            doSomething3();
        }   
    }

(c)空洞的另一种策略,我不是很喜欢它,但保留原始代码基本完整,是:

    public void myMethod() {
        try
        {
            if (condition1) {
            doSomething1();
            if (condition2) {
                doSomething2();
            } else {
                doSomething3();
            }
        }
        catch(Exception ex)
        {
            //  
        }
     }

然后,您的单元测试可以断言不会抛出任何异常。不理想,但如果需要必须......