2

我有以下代码(我已经为这个问题简化了):

    public void HandleModeInit(int appMode){
        switch(appMode){
            Case 1:
                DoThis();
            Case 2:
                DoThat();
            Case 3:
                //no mode 3
            Case 4:
                DoSomethingElse();
            Case else:
                //do nothing
        }
    }

在不将其转换为集成测试(最终测试 DoThis()、DoThat() 和 DoSomethingElse() 正在做什么)的情况下,如何对该方法进行单元测试?由于这些方法调用是对与 HandleModeInit() 相同的类中的方法进行的,您将如何测试呢

尽管在理想情况下,方法调用会被提取到另一个类中,但如果这一举动没有任何意义呢?

4

3 回答 3

0

您可以创建一个名为 IAppMode 的接口,而不是使用 switch/case 语句来切换应用程序模式(我假设调用者可以决定要实例化哪个对象以正确实现 IAppMode,因为它们已经传入一个 int 来表示应用程序模式)。

您的调用者将传入一个 IAppMode 对象,然后您的方法可以调用 IAppMode 的 DoThis() 方法。

然后,您可以创建一个实现 IAppMode 的虚拟对象,并在测试期间将其注入方法中。

它使您的代码更轻松(使用设计模式可以做到这一点)并且可以测试。

于 2009-10-05T12:54:18.803 回答
0

我意识到(尤其是你注意到它)代码被简化了,但是如果你不测试在这种情况下被调用的方法做了什么,你实际上在测试什么?的价值appMode

在不了解被调用方法内部发生的事情的情况下,很难(如果不是不可能的话)准确地攻击这个问题。他们是否在进行任何可以模拟的出站调用(对外部服务、数据库等)?如果是这样,那可能是一条前进的道路。如果它们仅包含封装在类中的行为,也许它们会更改某些属性值,您可以在调用HandleModeInit返回时检查这些值?

我通常不喜欢仅仅为了使其更可测试而改变代码的设计,但一种方法是将类的公共接口与内部分离,然后将内部接口定义为,一个界面。这样你就可以开始嘲笑内部了。

于 2009-10-05T12:55:35.497 回答
0

如果您可以控制传递给此方法的内容,那么我将传入一个接口,该接口将 appmode 作为参数,它是一个 AppModeImplementationFactory。这个工厂的目的是创建 AppModeImplementations。工厂将如下所示:

public class AppModeImplementationFactory: IAppModeFactory
{
   public IAppModeImplementation Create(int appMode)
   {
      // switch case goes here to create the appropriate instance
   }
}

当您传入工厂时,这可以是一个模拟实例,您可以验证是否调用了 create 方法。如果要验证返回的实例类型,则需要在不同的测试下进行。由于应用程序模式,这种方法将满足您执行逻辑的需求,因为工厂将根据应用程序模式返回您需要的实现。

希望这可以帮助

于 2009-10-06T03:06:54.160 回答