【问题标题】:Moq with Autofac Func<Owned<IClass>>Moq与Autofac Func <Used <iClass >>
【发布时间】:2023-03-29 03:03:01
【问题描述】:

我正在尝试切换一些代码,我必须使用 Owned Instances 而不是在容器周围传递。

public class SyncManager
{
    private Func<Owned<ISynchProcessor>> _syncProcessor = null;

    public SyncManager(Func<Owned<ISynchProcessor>> syncProcessor)
    {
        _syncProcessor = syncProcessor;
    }

    private void Handle()
    {
        using (var service = _syncProcessor())
        {
            service.Value.Process();   
        }
    }
}

现在我想 Moq the Func 并注入它,但是对 _syncProcessor() 的调用没有解决任何问题所以我尝试了这个。

Mock<ITimer> timer = new Mock<ITimer>();
Mock<Func<Owned<ISynchProcessor>>> syncProcessor = new Mock<Func<Owned<ISynchProcessor>>>();
Mock<Owned<ISynchProcessor>> proc = new Mock<Owned<ISynchProcessor>>();

[TestInitialize]
public void TestInitialize()
{
    timer = new Mock<ITimer>();
    syncProcessor = new Mock<Func<Owned<ISynchProcessor>>>();
    syncProcessor.Setup(item => item.Invoke()).Returns(() => proc.Object);
}

但这给了我一个运行时错误,它无法将 System.Linq.Expressions.InstanceMethodCallExpressionN 类型的对象转换为 System.Linq.InvocationExpression 类型

【问题讨论】:

    标签: c# moq autofac


    【解决方案1】:

    好的,我想我对此有点 Mock 高兴。没有理由嘲笑 Func。这样做似乎让我回到了正轨。

        Func<Owned<ISynchProcessor>> syncProcessor;
        Mock<ISynchProcessor> proc = new Mock<ISynchProcessor>();
    
        [TestInitialize]
        public void TestInitialize()
        {        
            syncProcessor = () => new Owned<ISynchProcessor>(proc.Object, new Mock<IDisposable>().Object);         
        }
    

    现在我可以将具体的 Func 传递到我的类中,让它返回我真正想要模拟的类,我的处理器,并验证它的调用是否正在完成和处理。

    【讨论】:

    • 非常好 :) 这是一种非常干净的处理方式
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多