单元测试mocking用法疑问:Setup配置逻辑与mock.Object作用咨询
问题1解答
你的初步理解完全正确。
这段代码是C#单元测试常用的Moq mocking框架的行为配置代码,作用分为两部分:
- 先构造预设的返回结果
tt,为PortfolioData对象的CurrentTotalValue、Stocks属性赋固定测试值 - 为mock对象的
GetPortfolio方法配置调用规则:当该方法接收到的入参恰好是"61377666d24fd78398a5a558"字符串时,就异步返回提前构造好的tt对象,不会执行该方法的真实业务逻辑。
这种配置的作用是把外部依赖的返回值完全固定,排除外部依赖的不稳定因素对单元测试结果的干扰。
问题2解答
这里的sut是*System Under Test(被测系统)*的通用缩写,这行代码的作用是初始化你要测试的PortfolioController实例。PortfolioController正常运行时,构造函数需要传入实现了对应业务接口的真实服务实例,会真的调用数据库/下游接口查询数据。单元测试阶段我们只需要验证控制器本身的逻辑是否正确,不需要依赖真实服务的可用性,所以把提前配置好行为的mock对象传入控制器,替换掉真实的服务依赖,保证测试过程完全受控。
问题3解答
你声明的mock变量本身是Moq框架提供的Mock<T>泛型类的实例(T就是你要mock的业务接口,比如IPortfolioService),它不是真正实现了该接口的业务对象,只是Moq用来配置代理行为的工具类。mock.Object就是Moq框架根据你配置的规则,动态生成的实现了目标接口T的代理对象实例,这个实例对上层调用方来说和真实的业务实现类实例没有任何使用差异,所有方法调用都会遵循你用Setup配置的规则返回预设结果,不会执行真实的业务逻辑。
内容的提问来源于stack exchange,提问作者moris62
相关产品推荐
相关产品推荐

