gpt4 book ai didi

phpunit - 模拟 Illuminate\Database\Eloquent\Model

转载 作者:行者123 更新时间:2023-12-04 02:49:36 25 4
gpt4 key购买 nike

我需要用 Mockery 模拟 Laravel 的 Eloquent\Model,这有点棘手,因为它使用静态方法。

我用下面的代码解决了这个问题,但我想知道是否有更好/更智能的方法来做到这一点。

<?php

use Ekrembk\Repositories\EloquentPostRepository;

class EloquentPostRepositoryTest extends TestCase {
public function __construct()
{
$this->mockEloquent = Mockery::mock('alias:Ekrembk\Post');
}

public function tearDown()
{
Mockery::close();
}

public function testTumuMethoduEloquenttenAldigiCollectioniDonduruyor()
{
$eloquentReturn = 'fake return';
$this->mockEloquent->shouldReceive('all')
->once()
->andReturn($eloquentDongu);
$repo = new EloquentPostRepository($this->mockEloquent);

$allPosts = $repo->all();
$this->assertEquals($eloquentReturn, $allPosts);
}
}

最佳答案

如果没有“Ekrembk\Repositories\EloquentPostRepository”的来源,很难说清楚,但是,我看到了几个问题。看起来在您的 EloquentPostRepository 中,您正在调用一个静态的。你不应该那样做。它使测试变得困难(正如您所发现的)。假设 Ekrembk\Post 从 Eloquent 扩展而来,你可以这样做:

<?php 
namespace Ekrembk\Repositories

class EloquentPostRepository {

protected $model;

public __construct(\Ekrembk\Post $model) {
$this->model = $model;
}

public function all()
{
$query = $this->model->newQuery();

$results = $query->get();

return $results;
}

}

那么,你的测试会更简单:

<?php

use Ekrembk\Repositories\EloquentPostRepository;

class EloquentPostRepositoryTest extends TestCase {

public function tearDown()
{
Mockery::close();
}

public function testTumuMethoduEloquenttenAldigiCollectioniDonduruyor()
{
$mockModel = Mockery::mock('\Ekrembk\Post');
$repo = new EloquentPostRepository($mockModel);
$eloquentReturn = 'fake return';

$mockModel->shouldReceive('newQuery')->once()->andReturn($mockQuery = m::mock(' \Illuminate\Database\Eloquent\Builder'));

$result = $mockQuery->shouldReceive('get')->once()->andReeturn($eloquentReturn);

$this->assertEquals($eloquentReturn, $result);
}
}

没有测试上面的内容,所以它可能有问题,但你应该明白了。

如果您查看 Illuminate\Database\Eloquent\Model,您会发现“public static function all”实际上只是在实例化的 Eloquent 模型上调用“get”。

关于phpunit - 模拟 Illuminate\Database\Eloquent\Model,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18034186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com