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
相关产品推荐
相关产品推荐

