Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 最小起订量和交易量范围,你能让最小起订量不算在内吗?_C#_.net_Unit Testing_Moq_Transactionscope - Fatal编程技术网

C# 最小起订量和交易量范围,你能让最小起订量不算在内吗?

C# 最小起订量和交易量范围,你能让最小起订量不算在内吗?,c#,.net,unit-testing,moq,transactionscope,C#,.net,Unit Testing,Moq,Transactionscope,当我使用一个我没有通信的Transactionscope时,moq仍然可以看到对数据库的所有回滚调用 有办法吗 _mockRepository.Verify(x => x.InsertSBI(It.IsAny<Int32>(), It.IsAny<Int32>(), It.IsAny<String>()), Times.Never()); \u mockRepository.Verify(x=>x.InsertSBI(It.IsAny(),It.IsA

当我使用一个我没有通信的Transactionscope时,moq仍然可以看到对数据库的所有回滚调用

有办法吗

_mockRepository.Verify(x => x.InsertSBI(It.IsAny<Int32>(), It.IsAny<Int32>(), It.IsAny<String>()), Times.Never());
\u mockRepository.Verify(x=>x.InsertSBI(It.IsAny(),It.IsAny(),It.IsAny()),Times.Never());
而不是

_mockRepository.Verify(x => x.InsertSBI(It.IsAny<Int32>(), It.IsAny<Int32>(), It.IsAny<String>()), Times.Exactly(4));
\u mockRepository.Verify(x=>x.InsertSBI(It.IsAny(),It.IsAny(),It.IsAny()),Times.justice(4));

要使测试成功?

我想到了几个策略

  • 为现有的DB访问类创建包装类。使该包装器等待将任何调用转发到底层实现,直到调用
    Commit
我不推荐这个。这将是一个只为测试保留的毫无意义的抽象,因为真正的DB类(可能)在幕后做同样的事情。它将等待调用DB,直到调用
Commit

  • 不要试图以这种方式验证数据访问。相反,验证未调用
    Commit
您试图做的是有状态测试—您正在根据
Commit
Rollback
如何影响这些调用来验证这些调用的状态。这不是使用mock的正确方法

如果验证未调用
Commit
,则测试回滚事务的代码的高级行为及其与DB类的交互。验证是否调用了rollback,是否未调用commit,并相信它将正确处理详细信息

比如:

_mockRepository.Verify(x => x.Commit(), Times.Never());
_mockRepository.Verify(x => x.Rollback(), Times.Once());

如果您需要验证DB类本身,您可以模拟其DB连接,并验证在调用
Rollback
时不会进行调用。但是,除非直接对DB类进行单元测试,否则不应该进行这种测试。

我想到了几种策略

  • 为现有的DB访问类创建包装类。使该包装器等待将任何调用转发到底层实现,直到调用
    Commit
我不推荐这个。这将是一个只为测试保留的毫无意义的抽象,因为真正的DB类(可能)在幕后做同样的事情。它将等待调用DB,直到调用
Commit

  • 不要试图以这种方式验证数据访问。相反,验证未调用
    Commit
您试图做的是有状态测试—您正在根据
Commit
Rollback
如何影响这些调用来验证这些调用的状态。这不是使用mock的正确方法

如果验证未调用
Commit
,则测试回滚事务的代码的高级行为及其与DB类的交互。验证是否调用了rollback,是否未调用commit,并相信它将正确处理详细信息

比如:

_mockRepository.Verify(x => x.Commit(), Times.Never());
_mockRepository.Verify(x => x.Rollback(), Times.Once());

如果您需要验证DB类本身,您可以模拟其DB连接,并验证在调用
Rollback
时不会进行调用。但是,除非您直接对DB类进行单元测试,否则不应该进行这种测试。

您是在模拟事务吗?如果是这样,那么验证对行插入的四个调用以及回调就足够了。您是否模拟了事务?如果是这样,那么验证对行插入的四个调用以及回调就足够了。对于第二个建议+1,尤其是因为我认为大多数DB类将向DB发送所有调用,并让DB处理回滚和提交(我还没有证实这一点,但如果这种事务性细节不是DB实现的责任,我会有点害怕)@DavidHall:ORM库通常实现本地更改跟踪,并且在必要时只实现往返。当然,关于何时进行往返的逻辑是复杂的,这就是为什么它应该单独测试,而不是在单元测试更高级别代码时(在集成测试中。理想情况下,它根本不应该像其他人编写和测试的那样直接测试).真的吗?我必须仔细阅读-我一直认为他们不会。我想这是有道理的,一个好的ORM会尝试帮助解决n+1问题,所以为什么不也进行事务管理呢。当然,正如你所说,关键点是,除非你在写ORM,否则它应该是一个实现细节,你不需要测试第二个建议是+1,特别是因为我认为大多数DB类将向DB发送所有调用,并让DB处理回滚和提交(我还没有验证这一点,但如果这种事务细节不是DB实现的责任,我会有点害怕)@DavidHall:ORM库通常实现本地更改跟踪,并且在必要时只实现往返。当然,关于何时进行往返的逻辑是复杂的,这就是为什么它应该单独测试,而不是在单元测试更高级别代码时(在集成测试中。理想情况下,它根本不应该像其他人编写和测试的那样直接测试).真的吗?我必须仔细阅读-我一直认为他们不会。我想这是有道理的,一个好的ORM会尝试帮助解决n+1问题,所以为什么不也进行事务管理呢。当然,正如你所说,关键点是,除非你在写ORM,否则它应该是一个实现细节,你不需要测试没错!