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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 15:09:04