我正在针对数据库编写一些单元测试,并且我们正在使用事务来确保我们的测试数据在最后被删除。
我遇到了一个问题,我正在测试的方法使用它们自己的 TransactionScope 对象,并且在访问数据库时它似乎被阻塞。
这是在我的测试的基类中:
BaseScope = new CommittableTransaction(new TransactionOptions() { IsolationLevel = IsolationLevel.ReadUnCommitted, Timeout = new System.TimeSpan(0, 5, 0) });
然后在我正在测试的方法中,它确实:
using (TransactionScope scope = new TransactionScope())
第二个范围内的代码第一次接触数据库时,它挂起。我有办法解决这个问题吗?
最佳答案
如果您使用的是数据库,那么您就不是在进行单元测试,您遇到的问题是真正的单元测试使用 Mocks 和 Stubs 的原因之一。
现在你正在做的测试非常有值(value),在某些情况下,我实际上会做它们而不是单元测试。我将其标记为早期集成测试 (EIT)。这里的关键是我们在使用真实的东西而不是单元测试模拟时发现了一类全新的错误。这里的关键是真实的东西。一旦你用人为的事务范围等来伪造环境,你就会失去 EIT 的大部分好处,因为你没有捕捉到微妙的交互错误,或者(如你的情况)引入人为问题。
我会找到一种方法来用足够的测试数据快速填充数据库,并在测试之外将其恢复到该状态。 “重置为已知状态”脚本对此类测试非常有帮助。
关于c# - TransactionScope 导致阻塞?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3886319/