我在使用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<,>
。
测试密钥注册的正确方法是什么?
答案 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返回相同的对象。