AutoMock - 如何使用键控注册进行单元测试?

时间:2017-12-13 16:47:02

标签: c# unit-testing autofac

我在使用Autofac键控注册的工厂周围编写测试时遇到问题。

在Autofac模块中,我注册了以下内容:

builder.RegisterType<TypeAMessageHandler>().As<IMessageHandler>()
    .Keyed<IMessageHandler>(MessageTypeEnum.A);

builder.RegisterType<TypeBMessageHandler>().As<IMessageHandler>()
    .Keyed<IMessageHandler>(MessageTypeEnum.B);

builder.RegisterType<MessageHandlerFactory().As<IMessageHandlerFactory>();

然后工厂的构造函数通过Autofac获取一个很好的Index注入到它的构造函数中:

public MessageHandlerFactory(
    IIndex<MessageTypeEnum, IMessageHandler> messageTypeToHandlerMap)

但是,当我使用IIndex<,>时,我无法弄清楚如何使用Automock为单元测试注入automock.Create<MessageHandlerFactory>()。告诉AutoMock提供消息处理程序实现并不会将它们放入键控索引中。创建IIndex的显式实现并要求Automock提供它也不起作用 - 在这两种情况下,我的工厂都会注入空IIndex<,>

测试密钥注册的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

我发现AutoMock实际上并没有内置对键控组件的支持,但是确实有重载的工厂方法,可用于配置容器。

这可行:

var messageAMock = new Mock<IMessageHandler>();
var autoMock = AutoMock.GetStrict(builder => builder.RegisterInstance(messageAMock.Object).Keyed<IMessageHandler>(MessageTypeEnum.A));

答案 1 :(得分:0)

好吧,我通过明确构建SUT设法解决了这个问题:

internal class MockIndex<T, T1> : Dictionary<T, T1>, IIndex<T, T1>
{
}

IIndex<FileTransportTypeEnum, IMessageHandler> index = new MockIndex<MessageTypeEnum, IMessageHandler>
{
    {MessageTypeEnum.A, new TypeAMessageHandler()},
    {MessageTypeEnum.B, new TypeBMessageHandler()}
};

_target = new MessageHandlerFactory(index);

在我的真实示例中,还有其他依赖项,我仍然希望找到一种方法让我使用Automock来提供这些依赖项的默认实现。另外,这种方式并不像Autofac那样真正起作用,因为每次调用它都会为TypeAMessageHandler返回相同的对象。