如何干净地单元测试自定义ValueResolver ResolveCore(...)方法

时间:2011-02-22 15:52:15

标签: unit-testing nunit automapper

我正在尝试对自定义ValueResolver(Automapper)进行单元测试,但遇到了问题,因为它强制我覆盖的方法不会直接暴露在我们必须创建的自定义对象中。我重写了受保护的方法“ResolveCore”,但暴露的唯一公共方法是“Resolve”,它需要一个复杂的“ResolutionResult”automapper对象作为它的输入。在真正的单元测试的过程中,我想要将这个对象/方法单独测试到其他任何东西,并且不想真正想要使用映射启动automapper来进行此测试。同样地,模拟“ResolutionResult”是不可能的,并且为每个测试设置它似乎是一个非常复杂的对象(再次需要创建/关联其他Automapper对象)。

我能想出的唯一(不太理想的)解决方案(并且在Googling寻求解决方案时已经看到建议)是在类中隐藏一个暴露受保护的覆盖方法的公共方法。如果我们必须走这条路,那就这样吧,但是有没有其他人得到一个更好的解决方案,单独测试方法调用不需要修改我们试图测试的对象?

示例代码:

public class CustomResolver : ValueResolver<Supplier, string>
{
    protected override string ResolveCore(Custom source)
    {
        return string.Format("{0} {1}", source.Name, source.Descripton);
    }

    public string UnitTestStub(Custom source)
    {
        return ResolveCore(source);
    }
}

1 个答案:

答案 0 :(得分:13)

我不会在你的课堂上放置公共存根。相反,我只是在单元测试程序集中创建一个简单的子类,它暴露了我想要测试的调用:

public class TestCustomResolver : CustomResolver
{
    public string TestResolveCore(Custom source)
    {
        return this.ResolveCore(source);
    }
}

其中一些取决于您正在使用的单元测试框架。例如,您可以使用InternalsVisibleTo()属性将内部结构暴露给单元测试。但是,我会在单元测试中倾向于一个简单的子类。