单元测试 | 如何在Mock时匹配匿名类型参数
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单元测试 | 如何在Mock时匹配匿名类型参数相关的知识,希望对你有一定的参考价值。
前言
假设,我们需要单元测试如下方法:
public User GetUser(int id)
return Repository.Query<User>(new ID = id ).FirstOrDefault();
而对于Repository.Query,我们需要进行Mock。
怎么实现?
不匹配具体参数值
如果我们不关心参数的具体值,可以简单地让它匹配任何object:
mockRepo.Setup(t => t.Query(
It.IsAny<object>()))
.Returns(user);
但是,如果要验证具体参数值时,下列方法无法工作:
mockRepo.Setup(t => t.Query(
new ID = 1 ))
.Returns(user);
因为单元测试和实际执行生成的匿名类型分别位于不同的Assembly,不能匹配。
Json序列化
把对象序列化成字符串,比如JSON,利用字符串比较进行匹配:
mockRepo.Setup(t => t.Query(
It.Is<object>(o => ToJson(o)==ToJson(new ID = 1 ))))
.Returns(user);
但是,这种方式不适合多个参数的情况:
new Name = "My IO", Age = 1
一旦改变属性声明的顺序,序列化匹配就会失效。
反射
反射匿名类型取出对应属性的值:
mockRepo.Setup(t => t.Query(
It.Is<object>(o => (int)o.GetType().GetProperty("ID").GetValue(o) == 1)))
.Returns(user);
这种方式能够实现完全灵活地进行比较,以确定参数是否匹配。但如果有多个属性要匹配,则非常繁琐。
结论
在本文中,我们提供了3种方式,在Mock时匹配匿名类型参数。
如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“
以上是关于单元测试 | 如何在Mock时匹配匿名类型参数的主要内容,如果未能解决你的问题,请参考以下文章
Moq + 单元测试 - System.Reflection.TargetParameterCountException:参数计数不匹配