gpt4 book ai didi

unit-testing - Laravel mock

转载 作者:行者123 更新时间:2023-12-04 04:48:52 24 4
gpt4 key购买 nike

我正在尝试在我的 Controller 中设置最简单的测试,但是与 Laravel 的大多数东西一样,没有像样的教程来演示简单的东西。

我可以像这样运行一个简单的测试(在一个名为 UserControllerTest 的文件中):

public function testIndex()
{
$this->call('GET', 'users');
$this->assertViewHas('users');
}

这将调用/users 路由并传入数组 users。

我想对 Mockery 做同样的事情,但是怎么做呢?

如果我试试这个:
public function testIndex()
{
$this->mock->shouldReceive('users')->once();

$this->call('GET', 'users');

}

我收到一条错误消息:“此模拟对象上不存在静态方法 Mockery_0_users::all。

为什么不?我在 mock 用户,它扩展了 Ardent 并反过来扩展了 Eloquent。为什么::all 对于模拟不存在?

顺便说一句,这些是 Mockery 的设置功能:
public function setUp()
{
parent::setUp();

$this->mock = $this->mock('User');
}

public function mock($class)
{
$mock = Mockery::mock($class);

$this->app->instance($class, $mock);

return $mock;
}

最佳答案

你不能直接模拟一个 Eloquent 类。 Eloquent 不是门面,你的用户模型也不是。 Laravel 有一点魔力,但你不能做那样的事情。

如果你想模拟你的 User 类,你必须将它注入(inject)到 Controller 构造函数中。如果您想这样做,存储库模式是一个很好的方法。 Google上有很多关于这种模式和Laravel的文章。

这里有一些代码向您展示它的外观:

class UserController extends BaseController {

public function __construct(UserRepositoryInterface $users)
{
$this->users = $users;
}

public function index()
{
$users = $this->users->all();
return View::make('user.index', compact('users'));
}

}

class UserControllerTest extends TestCase
{

public function testIndex()
{
$repository = m::mock('UserRepositoryInterface');
$repository->shouldReceive('all')->andReturn(new Collection(array(new User, new User)));
App::instance('UserRepositoryInterface', $repository);

$this->call('GET', 'users');
}

}

如果您的项目似乎过于结构化,您可以在测试中调用一个真实的数据库,不要模拟您的模型类......在经典项目中,它工作得很好。

关于unit-testing - Laravel mock ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25724391/

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