如何测试仅存在于该函数内部的变量的值?

时间:2019-06-06 21:05:05

标签: c# unit-testing

我正在尝试为某个函数实现一些单元测试,但是其中一个输入不会更改该函数返回的内容。即使此输入不会更改函数返回的内容,我仍然需要代码内部的API。该功能是这样的:

    public bool IsEmailSent(string userEmail, bool isJson)

    {

        var link = isJson ? "Link1" : "Link2";

        if (string.IsNullOrEmpty(userEmail))
        {
            return false;
        }

        //Some other code

        return true;
    }

我想做的是测试变量“ link”的值,该值取决于输入“ isJson”。所以我想实施的测试是这样的:

     [TestMethod]
     public void link_should_be_link2_when_isJson_is_false()
     {
            //if isJson is false && link = link2, test is sucessful
     }

问题是我不知道如何在测试中获取变量“ link”,以检查其值是否正确,因为我的函数未返回它。那么,如何测试依赖于给定输入的某些函数变量的值,但是我的函数没有返回接近该变量值的任何值?

2 个答案:

答案 0 :(得分:1)

执行单元测试时,请考虑黑框之类的功能。输入,测试等幂的测试组合。可以从单元测试中抽象出实际功能的实现。没有看到

//Some other code

我会看看您是否可以将API调用转换为辅助函数。然后,为helper函数编写单独的单元测试。

答案 1 :(得分:0)

由于函数中link的计算对返回值没有影响,因此它将具有其他一些可观察到的效果,因为否则将不需要该计算。在您的情况下,似乎可以通过您的函数link访问组件依赖项(DOC)的方式来观察效果,​​该函数可能是一些发送电子邮件的函数。

您在这里有多种选择:

  • 您可以模拟对DOC函数的调用,该函数将发送电子邮件以查看是否按预期的link中间值调用了该电子邮件。
  • 您可以按照elgonzo的建议从link中排除一些辅助功能。
  • 您可以考虑重构代码以避免使用布尔控制参数,该参数看起来像code smell,例如,对于Json和non-Json情况具有不同的功能。但是,然后必须根据您选择的新设计解决测试问题。
  • ...

但是,有些评论:单元测试不是黑盒技术。实际上,某些单元测试特定的测试设计技术仅对玻璃盒(也称为白盒)测试有意义,即所有基于覆盖率的测试设计方法。试图使整个单元测试套件独立于实现细节之外的尝试很可能导致效率低下的测试套件,即,一个不适合查找所有可能发现的错误的测试套件。

Bug最终在实现中。不同的实现会有不同的错误。考虑实现Fibonacci函数的不同方式:作为迭代/递归函数,闭式表达式(Moivre / Binet),查找表:每个实现都会带来不同的潜在错误。单元测试是test pyramid底部的测试方法,所有更高级别的测试(集成或系统测试)都不太适合在实现细节中查找错误。而且,发现错误是测试的主要目标之一(请参阅Myers,Badgett,Sandler:软件测试的技巧,或Beizer:软件测试技术等)。

因此,最好的方法是拥有尽可能多的独立于实现的有用测试。此外,您可能需要进行其他测试,以发现所选实现中的潜在错误。但是,实现方面的稳定性越差,您就越应该避免使测试依赖于此:与组成组件的正式API的功能相比,助手功能可能更可能被重命名,合并或删除。