我正在测试一个工厂,它只是检索新闻系统的所有“帖子”。我就砍例子来尽可能简单的东西:PHPUnit - 声明查询返回来自数据库的好数据
$newsFactory->getAllNews();
表看起来是这样的:
+---------+---------------------+-------------+
| news_id | news_publishedDate | news_active |
+---------+---------------------+-------------+
| 1 | 2010-03-22 13:20:22 | 1 |
| 2 | 2010-03-23 13:20:22 | 1 |
| 14 | 2010-03-23 13:20:22 | 0 |
| 15 | 2010-03-23 13:20:22 | 1 |
+---------+---------------------+-------------+
现在,我想测试的行为,(但我们只专注于第一个):
- 确保查询将返回唯一news_active = 1
- 确保查询将返回news_publishedDate订购的元素,前前后后新到老。
所以我做了什么,我认为是很好的测试数据的dbData.xml数据集:
<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
<table name="news">
<column>news_id</column>
<column>news_publishedDate</column>
<column>news_active</column>
<row>
<value>1</value>
<value>2010-03-20 08:55:05</value>
<value>1</value>
</row>
<row>
<value>2</value>
<value>2010-03-20 08:55:05</value>
<value>0</value>
</row>
<row>
<value>3</value>
<value>2011-03-20 08:55:05</value>
<value>1</value>
</row>
</table>
</dataset>
好了,所以让我们只检查第一个测试(不返回从该news_id#2 XML数据集)
我必须扩展类PHPUnit_Extensions_Database_TestCase使我NewsFactoryTest类:
<?php
require_once 'PHPUnit/Extensions/Database/TestCase.php';
class NewsFactoryTest extends PHPUnit_Extensions_Database_TestCase
{
protected $db;
protected function getConnection()
{
$this->db = new PDO('mysql:host=localhost;dbname=testdb', 'root', '');
return $this->createDefaultDBConnection($this->db, 'testdb');
}
protected function getDataSet()
{
return $this->createXMLDataSet(dir(__FILE__) . DIRECTORY_SEPARATOR . 'dbData.xml');
}
public function testGetNewsById()
{
$newsFactory = new NewsFactory($this->db);
$news = $newsFactory->getNewsById();
// ???
$this->assertEquals(2, count($news), "Should return only 2 results");
}
}
我的主要问题w ^应该是我该如何设置该测试?
在细节,我试着去理解:
- 我应该创建一个testdb的数据库,或者是所有的模拟/虚拟?
- 我见过很多使用sqlite :: memory的例子:,用sqlite测试基于MySQL的查询是个好主意吗?我可以使用mysql :: memory吗?
- 如果它是一个真正的数据库,在每次测试运行之前如何从数据库中的dbData.xml中恢复所有数据?
- 我应该在哪里调用getConnection()和getDataSet()?
感谢您的阅读&分享您的知识!
我知道这件事,我没有贴整个文件(我也编辑了列的数量......)你对你的答案是正确的。不知怎的,就像我写的第一个版本的测试。但现在我真的需要测试查询。问题不在于测试结果,更重要的是找到一种方便的方式来提供可供真实查询执行使用的测试数据,并替换默认的PDO实例。我会编辑我的问题,以反映...感谢您的意见! – FMaz008 2011-03-23 21:42:26