什么时候利用mock?

我们进行单元测试的时候,我们可能希望不要实际操作数据库,而是仿照数据库的交互,这样可以保护我们的数据库环境。

一些网络要求的api,可能会由于网络或者其它缘故原由导致要求非常,我们就须要利用本地仿照数据进行测试。

phpmockphpunit 中的mock PHP

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进行测试可以大大提高我们的测试效率,同时它也避免了对环境的毁坏。