如何在PHP7.2中使用Mocky进行单元测试,以及模拟有说服力的查询
我想为现有的生产系统创建一组单元测试,这些测试将在本地执行,由预提交挂钩触发 根据要求,测试最多必须运行3-4秒 根据定义,单元测试应该单独调用方法。但是,系统严重依赖于数据库,因此我希望能够模拟数据库调用 该应用程序正在运行PHP7.2、Laravel 5.5.4 我一直试图使用嘲弄,但没有成功。下面是一个简单的例子,说明我一直在尝试做的事情:如何在PHP7.2中使用Mocky进行单元测试,以及模拟有说服力的查询,php,unit-testing,laravel-5.5,mockery,Php,Unit Testing,Laravel 5.5,Mockery,我想为现有的生产系统创建一组单元测试,这些测试将在本地执行,由预提交挂钩触发 根据要求,测试最多必须运行3-4秒 根据定义,单元测试应该单独调用方法。但是,系统严重依赖于数据库,因此我希望能够模拟数据库调用 该应用程序正在运行PHP7.2、Laravel 5.5.4 我一直试图使用嘲弄,但没有成功。下面是一个简单的例子,说明我一直在尝试做的事情: public function testExample() { // Create a new user $newUser = new
public function testExample()
{
// Create a new user
$newUser = new User();
$newUser->id = 1;
// Mock the User
$mockedUser = Mockery::mock(User::class);
// Mock the Builder
$mockedBuilder = Mockery::mock(Builder::class);
$this->app->instance(Builder::class, $mockedBuilder);
$this->app->instance(User::class, $mockedUser);
// Set the expectations
$mockedBuilder->shouldReceive('first')->once()->andReturn($newUser);
$mockedUser->shouldReceive('where')
->with('id', 5)
->once()
->andReturn($mockedBuilder);
$this->assertEquals($newUser->id, User::where('id', 5)->first()->id);
}
然而,因为“where”实际上是对Builder的静态调用,所以它不起作用。
有什么办法可以实现吗?我曾想过嘲笑DB facade(或PDO),但它似乎太。。粗糙的。有更好的主意吗?你在嘲笑哪个构建器类?where不应该是对Builder的静态调用,因为它使用的是Laravel的facades。我尝试使用
illighte\Database\Query\Builder
和illighte\Database\elogent\Builder
,两者都不起作用。这是xdebug非常有用的地方,可以查看调用的最终结果。如果不尝试,很难告诉您mysel.fXdebug显示我正在输入'illumb\Database\elogent\Builder'的'where'方法。