Assert.IsType<>与Moq框架兼容异常,如何断言Mock对象类型?
解决Moq Mock对象类型断言失败的问题
嘿,这个坑我之前踩过!Moq生成的Mock对象其实是继承自你目标类的动态代理子类(比如你遇到的Castle.Proxies.UserProxy),它并不是严格意义上的User类实例,所以直接用Assert.IsType<User>()做严格类型断言肯定会失败。
下面给你两种靠谱的解决办法:
方法一:使用Assert.IsAssignableFrom<T>()断言
这个方法的作用是验证对象是否可以被转换为指定的目标类型,完美适配Moq代理的场景——因为代理子类本来就继承自User,所以这个断言会通过。示例代码:
var userMock = new Mock<User>().Object; Assert.IsAssignableFrom<User>(userMock);
方法二:用Assert.IsInstanceOfType(适配部分测试框架)
如果你的测试框架是xUnit这类支持IsInstanceOfType的,也可以用这个方法,效果和上面一致:
var userMock = new Mock<User>().Object; Assert.IsInstanceOfType(userMock, typeof(User));
额外小技巧
如果你之后还需要对这个Mock对象做设置或者验证操作,可以通过Mock.Get()方法从代理对象中获取原始的Mock实例:
var userMock = new Mock<User>().Object; var originalMock = Mock.Get(userMock); // 比如后续可以做验证:originalMock.Verify(u => u.SomeMethod(), Times.Once);
总结一下:Moq的代理类本质是目标类的子类,所以别纠结“严格等于目标类型”,转而断言“可赋值给目标类型”就搞定啦!
内容的提问来源于stack exchange,提问作者lukas.figueiredo
相关产品推荐
相关产品推荐

