我正在尝试为我的Yii项目构建单元测试。
问题:MySQL数据库。我不想每次运行测试时都运行MySQL数据库,因为它很慢,不可靠,也许有些团队成员没有设置等等。
似乎有一种方法可以在内存中使用SQLite DB并使用它,但是Yii生成的SQL似乎不像SQL上那样在MySQL上运行。我收到很多错误。
简而言之:我想在内存中模拟MySQL数据库。
我该怎么做?
答案 0 :(得分:5)
将您的MySQL操作封装在Data Access Object中。您不仅可以从业务逻辑中隐藏具有其他优势的SQL,还可以在测试应用程序的其余部分时使用mock DAO。模拟不需要数据库,并允许您验证业务逻辑是否正在调用数据层。
这与Mchl的答案类似,但是将模拟移动到一层。我发现模拟findUserByEmail()
而不是各种mysqli
方法要容易得多。您可以将SQL验证留给DAO测试,并在集成测试中针对数据库运行。
答案 1 :(得分:1)
一种方法是模拟连接对象并检查是否使用预期的SQL调用了query()
方法。您需要另一种方法来验证您期望的SQL是否正确。这可以作为一组单独的测试(或者甚至移到测试套件之外)来完成,这样它就不会与所有其他测试一起运行。