PHPUnit的Mock MySQL数据库

11

我正在尝试为我的Yii项目构建单元测试。

问题在于MySQL数据库。我不想每次运行测试时都要运行MySQL数据库,因为它很慢、不可靠,有些团队成员可能没有设置好等等。

似乎有一种方法可以在内存中使用SQLite DB并使用它,但是Yii产生的SQL在SQLite上似乎与在MySQL上不同。我得到了很多错误。

简而言之:我想在内存中模拟一个MySQL数据库。

我该怎么做?

2个回答

7
将您的MySQL操作封装在数据访问对象中。不仅可以将SQL隐藏在业务逻辑之外,从而获得其他好处,还可以在测试应用程序的其余部分时使用mock DAO。模拟不需要数据库,并允许您验证业务逻辑是否正确调用了数据层。
这类似于Mchl的答案,但将模拟向上移动了一层。我发现模拟findUserByEmail()比模拟各种mysqli方法要容易得多。您可以将SQL验证留给DAO测试,并在集成测试中针对数据库运行。

3

一种方法是模拟连接对象并检查其是否使用预期的SQL调用了query()方法。然而,您需要另一种方法来验证您期望的SQL是否正确。这可以作为一组单独的测试(甚至移动到测试套件之外)进行,以便它不会与所有其他测试一起运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接