在node.js上unit testingmysql回滚

我在一个节点项目中使用mysql。

我想unit testing一个JavaScript函数,使一个SQL交易。 如果事务成为locking监视器的受害者,则该函数具有处理失败的代码。

还是呢?

因为我是unit testing,所以我只在一个本地数据库上进行一次事务处理,所以不会出现死锁,对吗? 我怎样才能testing死锁处理,如果它永远不会发生? 有没有办法强制它发生?

例:

thisMustBeDoneBeforeTheQuery(); connection.queryAsync(/*This is an update*/).catch(function(err) { undoThatStuffIDidBeforeTheQuery(); // I hope that function worked, because my unit tests can't // make a deadlock happen, so I can't know for sure. } 

什么是您的testing需要保护或validation的基本行为? 你需要testing你的MySQL驱动程序? 还是MySql本身? 我认为@ k0pernikus确定了最高的价值testing:

假设数据库客户端由于死锁而导致exception,那么应用程序代码如何处理?

您应该可以非常容易地使用模拟库或dependency injection来创buildtesting工具,并testing存根来模拟客户端驱动程序返回死锁exception。 这不应该需要任何与MySQL的交互,除了初步调查,看看你的MySQL客户端驱动程序返回代码/错误exception传播的样子。

这不是一个100%完美的testing,并且在mysql客户端库更改的情况下仍然会使您的易受攻击性降低。


由于时间的原因,确定性地再现并发问题通常是非常困难的。 但是使用SELECT ... FOR UPDATE和多个事务应该能够确定性地在mysql上重现一个死锁,来validation你的客户端库代码。