如何将Moq的AddScoped模拟代码转换为NSubstitute实现?
解决NSubstitute替代Moq的Mock.Of初始化属性问题
原Moq代码通过Mock.Of<T>用表达式直接设置模拟对象的属性返回值,NSubstitute的语法逻辑不同,你之前的写法不符合它的API规范,所以报错。正确的实现方式是先创建替代实例,再单独配置属性的返回值:
services.AddScoped(provider => { var currentUserService = Substitute.For<ICurrentUserService>(); currentUserService.UserId.Returns(_currentUserId); return currentUserService; });
原因说明
- Moq的
Mock.Of<T>(expression)支持通过表达式直接定义成员行为,但NSubstitute的Substitute.For<T>()方法仅接受构造函数参数(接口无构造函数时无需传参),不支持这种条件表达式语法。 - NSubstitute配置属性返回值的标准方式是调用
Returns()方法,针对目标属性单独设置返回内容。
如果需要同时配置多个属性,可以链式扩展:
services.AddScoped(provider => { var currentUserService = Substitute.For<ICurrentUserService>(); currentUserService.UserId.Returns(_currentUserId); currentUserService.UserName.Returns("测试用户"); currentUserService.TenantId.Returns("租户001"); return currentUserService; });
内容的提问来源于stack exchange,提问作者RoLYroLLs
相关产品推荐
相关产品推荐

