如何使用AutoMock模拟Func<T>工厂依赖使其每次返回不同对象
问题原因
AutoMock 默认对自动解析的未显式注册类型使用 单例/作用域单例 生命周期,因此同一个 AutoMock 作用域内多次调用 Func<T> 只会返回同一个实例。而原生 AutoFac 中 AnyConcreteTypeNotAlreadyRegisteredSource 默认给未注册的具体类型分配 瞬时(InstancePerDependency) 生命周期,两者的默认行为不一致才会导致测试失败。
解决方案
方案1:手动注册依赖为瞬时生命周期
只需要在创建被测类之前,显式给TestDep注册瞬时生命周期即可,修改后的测试用例如下:[TestMethod()] public void TestIt() { using var autoMock = AutoMock.GetStrict(builder => { builder.RegisterType<TestDep>().AsSelf().InstancePerDependency(); }); var testClass = autoMock.Create<TestClass>(); var obj1 = testClass.Get(); var obj2 = testClass.Get(); Assert.AreNotEqual(obj1, obj2); }方案2:对齐生产环境的AutoFac配置
如果你需要批量适配所有未注册具体类型的行为,直接在AutoMock初始化时添加和生产环境一致的AnyConcreteTypeNotAlreadyRegisteredSource即可:[TestMethod()] public void TestIt() { using var autoMock = AutoMock.GetStrict(builder => { builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource()); }); var testClass = autoMock.Create<TestClass>(); var obj1 = testClass.Get(); var obj2 = testClass.Get(); Assert.AreNotEqual(obj1, obj2); }
内容的提问来源于stack exchange,提问作者Rob Rob
相关产品推荐
相关产品推荐

