我有一个名为ProcessMessage(IMessage message, IMessageHandler<IMessage> messageHandler)
的方法。包含的类有一组Message处理程序:List<IMessageHandler<IMessage>> messageHandlers
。
我需要从List<IMessageHandler<IMessage>>
中提取一个特定的消息处理程序来正确处理任何给定的消息。
ProcessMessage(message, this.messageHandlers.SingleOrDefault
(
mh => mh.GetType().GetGenericArguments()[0].GetType() == message.GetType()
));
当我尝试对此功能进行单元测试时,会出现问题。我需要用模拟的消息处理程序填充我的List<IMessageHandler<IMessage>>
。不幸的是,GetType()是非虚拟的,我从moq获得了标准的“非虚拟成员上的无效设置”错误。或者更好的方法来设置我的测试数据?
有没有更好的方法来构建它,以便我不必使用非虚方法(即:GetType)来进行比较?
答案 0 :(得分:0)
您永远不应该将您的单元测试基于实现细节,您应该测试代码的功能。
您的代码使用GetType()
方法的事实只是一个实现细节。更重要的是,您的代码应该能够为提供的消息找到正确的消息处理程序。
要测试代码的功能,可以创建IMessage
和IMessageHandler<IMessage>
接口的一些手动实现。一些值得报道的测试用例: