也许您可以重构第一个示例并使用一些DB访问包装类?
在这个包装类中,您可以有一个变量$normalcommit=true;
以及设置$normalCommit变量的方法setCommitmode()。
还有一个方法commit(),如果($normalCommit==true),它将提交。
或者甚至有一个变量$failtransaction,它调用mysql_query(“rollback”);如果您愿意的话(这样您可以通过/失败许多顺序测试)。
然后,运行测试时,可以在测试代码文件中的某个位置设置:
$mydbclass->setcommitmode(假);
或
$mydbclass->RollbackNextOperation(true);
在你希望失败的操作之前,它只会失败。这样,您正在测试的代码将不包含那些失败/提交检查,只有db类将包含它们。
通常,只有测试代码(尤其是在进行单元测试的情况下)才应该调用这些setCommitmode和rollbackNextOperation方法,因此您不小心将这些调用留在生产代码中。
或者,您可以将一些疯狂的数据传递给您的方法(如果您正在测试一个方法),比如将负变量保存到无符号字段中,然后,如果您的代码在这种SQL错误之后没有提交(但它不应该提交),则事务应该100%失败。