Unit testing 部分模拟或新类或其他什么?

Unit testing 部分模拟或新类或其他什么?,unit-testing,testing,mocking,Unit Testing,Testing,Mocking,我有一个关于测试的问题 我有一个返回异常的类。在这个类中,我有两个不同的方法,只返回两种不同类型的异常,一个返回所有异常(两种类型) 以下是示例代码: public interface IAnomalyService { IList<Anomaly> GetAllAnomalies(object parameter1, object parameter2); IList<Anomaly> GetAnomalies_OfTypeA(object param

我有一个关于测试的问题

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

以下是示例代码:

 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; }
}
公共接口IAnomalyService
{
IList GetAllAnomalies(对象参数1,对象参数2);
IList getu of typea(对象参数1);
IList getu of typeb(对象参数2);
}
公共类异常服务:IAnomalyService
{
公共IList GetAllAnomalies(对象参数1,对象参数2)
{
var lstAll=新列表();
lstAll.AddRange(类型(参数1)的getu);
lstAll.AddRange(类型b(参数2)的getu);
返回lstAll;
}
类型的公共IList getu(对象参数1)
{
//一些细节
返回新列表{新异常{Id=1}};
}
类型B的公共IList getu(对象参数2)
{
//一些细节
返回新列表{新异常{Id=2}};
}
}
类异常
{
公共int Id{get;set;}
}
我已经为两种方法创建了测试,这两种方法检索类型A和类型B的异常(类型A的GetExceptions_和类型B的GetExceptions_)。 现在我想测试GetAllAnomalies函数,但我不确定我必须做什么

我想我必须用一种方法来测试它: 1) 将AnomalyService类中TypeA的GetExceptions_和TypeB的GetExceptions_声明为virtual,对AnomalyService类进行模拟,使用Moq I可以将CallBase设置为true,并模拟TypeA的GetExceptions_和TypeB的GetExceptions_两种方法

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

我在单元测试方面是新手,所以我不知道哪种解决方案更好,如果是一个地雷还是另一个地雷。 你能帮我吗

多谢各位
Luca

当类拒绝测试时,模拟是一个很好的工具。如果你有来源,模仿通常是没有必要的。尝试以下方法:

  • 创建一个工厂,该工厂可以返回具有各种已定义异常的异常服务(仅a型、仅B型、两者、无、仅C型……)
  • 因为这三种类型是以某种方式连接的,所以您应该在每个测试中检查这三种类型。如果仅预期类型A的异常,则应检查
    GetAllAnomalies
    是否返回与类型A的
    GetAnomalies\u
    相同的结果,以及类型B的
    GetAnomalies\u
    是否返回空列表

很抱歉,我不明白您创建工厂的意思。我已经为类型A的GetExceptionals_和类型B的GetExceptionals_创建了单元测试,所以我不想在测试GetAllAnomalies时再进行测试。我想测试的是,在方法“getallanomalies”中,我不会忘记调用getExceptions\u of TypeA和getExceptions\u of TypeB。我的意图是模拟一些东西,因此GetAnomaliseOfTypeA返回3个异常,oftypeb返回4个异常,当我调用getallanomalies时,我必须检查它是否返回7个异常将为第一个单元测试设置
AnomaliseService
的代码移动到工厂中。理想情况下,工厂应该这样工作:“添加1个类型A的异常和3个类型B的异常,并返回服务”,这允许您创建任意数量的任何类型的异常,然后测试服务是否对它们正常工作。目标:测试中的设置代码应该是1行。