【问题标题】:Partial Mock or new class or what else?部分模拟或新课程或其他什么?
【发布时间】:2012-08-03 08:50:13
【问题描述】:

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

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

这是示例代码:

 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 接口,然后我可以测试 GetAllAnomalies 模拟 IAnomalyService 接口。

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

谢谢你 卢卡

【问题讨论】:

    标签: unit-testing testing mocking


    【解决方案1】:

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

    • 创建一个可以返回 AnomalyServices 的工厂,其中包含各种已定义的异常(仅 A 类,仅 B 类,两者,无,仅 C 类,...)
    • 由于这三种类型以某种方式连接,因此您应该在每次测试中检查所有三种类型。如果只预期 A 类异常,则应检查 GetAllAnomalies 是否返回与 GetAnomalies_OfTypeA 相同的结果,并且 GetAnomalies_OfTypeB 返回一个空列表。

    【讨论】:

    • 对不起,我没明白你说的创建工厂是什么意思。我已经为 GetAnomalies_OfTypeA 和 GetAnomalies_OfTypeB 创建了单元测试,所以当我测试 GetAllAnomalies 时我不想再测试了。我要测试的是,在“getallanomalies”方法中,我不会忘记调用 GetAnomalies_OfTypeA 和 GetAnomalies_OfTypeB。我的意图是模拟某些东西,以便 GetAnomaliesOfTypeA 返回 3 个异常,oftypeb 返回 4 个异常,当我调用 getallanomalies 时,我必须检查它是否返回 7 个异常
    • 将第一个单元测试设置AnomalyService的代码移入工厂。理想情况下,工厂应该像这样工作:“添加 1 个 A 类型的异常和 3 个 B 类型的异常并返回服务” 这允许您创建任意数量的任何类型的异常,然后测试服务是否适用于它们。目标:测试中的设置代码应该是 1 行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 2021-05-28
    • 2020-01-04
    • 2013-07-29
    • 1970-01-01
    相关资源
    最近更新 更多