什么是mock?
mock就是使用一段伪造的代码来模拟实际的功能处理,模拟出来的数据和我们实际请求处理的数据是类似的或者匹配的。
什么时候使用mock?
当我们进行单元测试的时候,我们可能希望不要实际操作数据库,而是模拟数据库的交互,这样可以保护我们的数据库环境。
一些网络请求的api,可能会因为网络或者其它原因导致请求异常,我们就需要使用本地模拟数据进行测试。
phpunit中如何使用mock
对于数据库的mock,我们经常使用的就是伪造对象。
在php中,我们操作数据库很多情况下都是通过ORM来操作的,也就是通过关系对象模型来处理数据库内容。
我们可以伪造数据库对象,并对数据进行伪造赋值,这样,我们在调用ORM的相关操作的时候,就可以直接从伪造的数据中获取。
具体代码如下:
class Person
{
public $db = null;function __construct($db)
{
$this->db = $db;
}public function greeting($id)
{
$friend = $this->db->getPersonByID($id);
$friendName = $friend->name;
return "$friendName";
}
}
$db = new Database();
$person = new Person($db);
$dbMock = $this->getMockBuilder(Database::class)
->setMethods(['getPersonByID'])
->getMock();
$mockPerson = new stdClass();
$mockPerson->name = '梦回故里';
$dbMock->method('getPersonByID')->willReturn($mockPerson);
$test = new Person($dbMock);
$this->assertEquals('梦回故里', $test->greeting(2));
通过拦截orm操作数据库的方法,我们就可以对数据库方法进行测试。
使用第三方库
对于数据库的测试,我们还可以使用第三方库dbunit。
虽然使用orm进行数据库的mock可以模拟数据的操作和查询,但是毕竟没有操作数据库,因此还是有一定的问题存在,而dbunit解决了这个问题,它是真正去操作数据库。
总结
mock的出现为我们提供了一种新的测试方法,在不影响数据的情况下,使用mock进行测试可以大大提高我们的测试效率,同时它也避免了对环境的破坏。