如何对基于类型处理参数的方法进行单元测试

时间:2016-11-18 22:44:36

标签: c# unit-testing moq

我有一个名为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)来进行比较?

1 个答案:

答案 0 :(得分:0)

您永远不应该将您的单元测试基于实现细节,您应该测试代码的功能。

您的代码使用GetType()方法的事实只是一个实现细节。更重要的是,您的代码应该能够为提供的消息找到正确的消息处理程序。

要测试代码的功能,可以创建IMessageIMessageHandler<IMessage>接口的一些手动实现。一些值得报道的测试用例:

  1. 调用正确的消息处理程序
  2. 某条消息有多个消息处理程序
  3. 某条消息没有消息处理程序