c# - C# 中的最小起订量事务范围

标签 c# moq transactionscope

是否有任何方法可以最小化事务范围以确保在流程中调用提交、完成或回滚操作?

鉴于此功能:

public void DoSomething(int param)
{
    using (TransactionScope transactionScope = new TransactionScope())
    {
        factory.DoSomething(param);
        factory.DoSomethingElse(param);

        transactionScope.Complete();
    }
}

有什么方法可以通过 IDisposable 接口(interface)调用 Verify 函数吗?它似乎只包含一个 Dispose 函数,我想测试 Commit 或 Rollback。

谢谢

最佳答案

TransactionScope是密封类,仅派生自 IDisposable 接口(interface)。 正如我所考虑的,您需要为 TransactionScope 和接口(interface)创建自己的包装类,以便您可以使用和模拟它。

class TransScopeWrapper : ITransScope, IDisposable
{
    private TransactionScope scope;

    public TransScopeWrapper()
    {
        scope = new TransactionScope();
    }

    public void Dispose()
    {
        scope.Dispose();
    }
    public void Complete()
    {
        scope.Complete();
    }

    public void Rollback()
    {
        ...
    }
}


internal interface ITransScope
{
    void Complete();
    void Rollback();
}

您还需要以某种方式注入(inject) ITransScope 模拟。我会按照以下方式进行

public void DoSomething(int param)
{
    using (TransScopeWrapper transactionScope = new TransScopeWrapper ())
    {
        DoSomething(param, transactionScope);
    }
}

internal void DoSomething(int param, ITransScope transaction) 
{ 
    factory.DoSomething(param);
    factory.DoSomethingElse(param);

    transaction.Complete();
}

现在您可以测试模拟 ITransScopeDoSomething(int param, ITransScope transaction) 方法。

关于c# - C# 中的最小起订量事务范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36059017/

相关文章:

c# - 使用 EPPLUS 创建数据透视表过滤器

c# - AutoMapper ProjectTo 继承问题

c# - 如何知道代码是否在 TransactionScope 内?

c# - 使用 EF Core 和内存数据库进行单元测试

SQL Azure 中的 TransactionScope()

Transactionscope .net core 2

C#:反序列化 XML 文件错误(认为这是一个命名空间问题 - 虽然我一生都无法解决)

c# - WPF 控件的嵌套属性的数据绑定(bind)

dependency-injection - 使用 Moq 和 CaSTLe Windsor 进行部分模拟

c# - 如何模拟返回 void 但修改通过 Moq 传入的引用类型的方法