You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NSubstitute是否有Moq的Automocker.CreateInstance等效实现方案?

解决NSubstitute结合AutoFixture时自定义Mock未生效的问题

你遇到的问题核心是:AutoFixture的AutoNSubstituteCustomization会自动为IRepo生成新的替代实例,你手动创建的repo并没有被关联到Fixture的实例创建流程中,所以最终注入到Service里的是Fixture自动生成的、未配置的IRepo,自然会返回null。

下面提供两种可行的解决方案:

方案一:注册手动配置好的Mock到Fixture

先创建并配置你的Mock,再将它注册到Fixture中,让Fixture在创建Service时优先使用这个实例:

var fixture = new Fixture();
fixture.Customize(new AutoNSubstituteCustomization());

// 创建并配置自定义Mock
var repo = Substitute.For<IRepo>();
repo.GetById(Arg.Any<int>()).Returns(someObjectOrValue);

// 将配置好的Mock注册为IRepo的提供源
fixture.Register<IRepo>(() => repo);

// 此时创建的Service会注入你配置好的repo
var service = fixture.Create<Service>();
service.MethodToTest();

// 验证Mock的调用情况
repo.Received().GetById(Arg.Any<int>());

方案二:使用Freeze获取并配置Fixture生成的Mock

利用AutoFixture的Freeze方法,直接获取Fixture为IRepo生成的替代实例,配置其行为后,Fixture会自动将这个实例注入到后续创建的Service中:

var fixture = new Fixture();
fixture.Customize(new AutoNSubstituteCustomization());

// Freeze会生成IRepo的替代实例并注册为单例,后续Create都会复用它
var repo = fixture.Freeze<IRepo>();
// 配置Mock的返回逻辑
repo.GetById(Arg.Any<int>()).Returns(someObjectOrValue);

// 创建Service,自动注入已配置好的repo
var service = fixture.Create<Service>();
service.MethodToTest();

// 验证调用
repo.Received().GetById(Arg.Any<int>());

这两种方案都能避免手动构造注入所有依赖的繁琐工作,实现类似Moq中AutoMocker的自动注入效果。

内容的提问来源于stack exchange,提问作者JLauter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 08:35:54