如何为调用同一类中的其他方法的方法创建基于状态的测试?

时间:2009-10-05 12:46:31

标签: c# unit-testing xunit

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

    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()相同的类,你将如何测试它?

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

3 个答案:

答案 0 :(得分:0)

不是使用switch / case语句来切换appModes,而是可以创建一个名为IAppMode的接口(我假设调用者可以决定哪个对象实现正确实现IAppMode,因为他们已经将int传递给代表App模式)。

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

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

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

答案 1 :(得分:0)

我意识到(特别是在你注意到的情况下)代码是愚蠢的,但如果你不测试在这种情况下被调用的方法做什么,你实际测试的是什么? appMode的价值?

如果不知道一些关于被调用方法内部发生的事情的话,如何确切地攻击这个很难(如果不是不可能的话)。他们是否可以进行任何可以嘲笑的外拨电话(外部服务,数据库等)?如果是这样,那可能是一条前进的道路。如果它们只包含封装在类中的行为,那么它们可能会改变一些属性值,您可以在调用HandleModeInit时返回该属性值吗?

我通常不喜欢改变我的代码设计,只是为了使它更易于测试,但一种方法是将类的公共接口与内部结构分开,然后将内部接口定义为好吧,一个界面。这样你就可以打开嘲笑内部。

答案 2 :(得分:0)

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

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

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

希望这有帮助