0

我有一个关于测试的问题。

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

这是示例代码:

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

我是单元测试的新手,所以我不知道哪种解决方案更好,是其中一个还是另一个。你能帮助我吗?

谢谢卢卡

4

1 回答 1

0

当一个类拒绝测试时,模拟是一个很好的工具。如果您有源代码,则通常不需要模拟。试试这个方法:

  • 创建一个可以返回AnomalyService具有各种已定义异常的 s 的工厂(仅类型 A,仅类型 B,两者,无,仅类型 C,...)
  • 由于这三种类型以某种方式连接,因此您应该在每个测试中检查所有三种类型。如果只预期 A 类型的异常,您应该检查它GetAllAnomalies返回的结果与返回相同的结果GetAnomalies_OfTypeAGetAnomalies_OfTypeB返回一个空列表。
于 2012-08-03T09:28:21.753 回答