部分模拟或新课程或其他什么?

时间:2012-08-03 08:50:13

标签: unit-testing testing mocking

我对测试有疑问。

我有一个返回异常的类。在这个类中,我有两种不同的方法,只返回两种不同类型的异常,一种返回所有异常(两种类型)

这是示例代码:

 public interface IAnomalyService
{
    IList<Anomaly> GetAllAnomalies(object parameter1, object parameter2);
    IList<Anomaly> GetAnomalies_OfTypeA(object parameter1);
    IList<Anomaly> GetAnomalies_OfTypeB(object parameter2);
}
public class AnomalyService : IAnomalyService
{
    public IList<Anomaly> GetAllAnomalies(object parameter1, object parameter2)
    {
        var lstAll = new List<Anomaly>();
        lstAll.AddRange(GetAnomalies_OfTypeA(parameter1));
        lstAll.AddRange(GetAnomalies_OfTypeB(parameter2));
        return lstAll;
    }
    public IList<Anomaly> GetAnomalies_OfTypeA(object parameter1)
    {
        //some elaborations
        return new List<Anomaly> { new Anomaly { Id = 1 } };
    }
    public IList<Anomaly> GetAnomalies_OfTypeB(object parameter2)
    {
        //some elaborations
        return new List<Anomaly> { new Anomaly { Id = 2 } };
    }
}

class Anomaly
{
    public int Id { get; set; }
}

我已经为检索A类和B类异常(GetAnomalies_OfTypeA和GetAnomalies_OfTypeB)的两种方法创建了测试。 现在我想测试函数GetAllAnomalies但我不确定我该做什么。

我想我必须测试它: 1)将类AnomalyService中的GetAnomalies_OfTypeA和GetAnomalies_OfTypeB声明为虚拟,模拟类AnomalyService,并使用Moq我可以将CallBase设置为true并模拟两个方法GetAnomalies_OfTypeA和GetAnomalies_OfTypeB。

2)将方法GetAllAnomalies移动到名为AllAnomalyService的另一个类(带有接口IAllAnomalyService)中,在其构造函数中,我将传递IAnomalyService的接口,然后我可以测试模拟IAnomalyService接口的GetAllAnomalies。

我是单位测试的新手,所以我不知道哪种解决方案更好,如果是其中一个或另一个。 你能救我吗?

谢谢你 卢卡

1 个答案:

答案 0 :(得分:0)

当一个类抵抗测试时,模拟是一个很好的工具。如果您有源,则通常不需要进行模拟。试试这种方法:

  • 创建一个工厂,可以返回AnomalyService个带有各种已定义的异常(只有A型,只有B型,两者,没有,只有C型......)
  • 由于这三种类型以某种方式连接,您应该检查每个测试中的所有三种类型。如果只需要类型A的异常,则应检查GetAllAnomalies返回与GetAnomalies_OfTypeA相同的结果,GetAnomalies_OfTypeB返回空列表。