gpt4 book ai didi

php - 尝试使用 IoC 容器在我的 Controller 测试中交换模型,但对象不是交换器

转载 作者:搜寻专家 更新时间:2023-10-31 21:08:14 26 4
gpt4 key购买 nike

我正在尝试使用 IoC 容器在测试时换出我的问题模型。虽然我已经创建了一个模拟模型,并在我的测试期间使用 App::instance() 尝试交换依赖关系,但我可以从 var_dump 中看到它不起作用。我的代码有什么问题?

<?php

class QuestionsControllerTest extends TestCase {

protected $mock;

public function __construct()
{
// This is how Net tuts tutorial instructed, but
// I got Eloquent not found errors
// $this->mock = Mockery::mock('Eloquent', 'Question');

// so I tried this instead, and it created the mock
$this->mock = Mockery::mock('App\Question');
}

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

public function testQuestionIndex()
{
// var_dump(get_class($this->mock)); exit; // outputs: Mockery_0_App_Question
// var_dump(get_class($this->app)); exit; // outputs: Illuminate\Foundation\Application

$this->mock
->shouldReceive('latest')
->once()
->andReturnSelf();

$this->mock
->shouldReceive('get') //EDIT: should be get
->once()
->andReturn('foo');

$this->app->instance('App\Question', $this->mock);


// dispatch route

$response = $this->call('GET', 'questions');

$this->assertEquals(200, $response->getStatusCode());
}
}

到目前为止还好吗?下面是我的问题 Controller :

class QuestionsController extends Controller {

protected $question;

public function index(Question $question)
{
// var_dump(get_class($question)); exit; // Outputs App\Question when testing too

$questions = $question
->latest()
->get();

return view('questions.index', compact('questions'));
}
...

因此,如果不交换对象,无论如何它都不会注册对方法的调用:

Mockery\Exception\InvalidCountException: Method latest() from Mockery_0_App_Question should be called
exactly 1 times but called 0 times.

顺便说一下,我已经安装了 Mockery ~0.9、Laravel 5.0 和 PHPUnit ~4.0。真的非常感谢这方面的任何帮助。

最佳答案

我认为您在使用instance() 时需要指定完整的命名空间。否则,Laravel 将假定模型位于全局命名空间('\Question')中。

这应该有效:

$this->app->instance('App\Question', $this->mock);

现在关于另一个问题,你的模拟。既然你的观点想要一个集合,为什么不给它一个呢?如果您不想测试 View ,您可以简单地实例化一个空集合并返回它:

$this->mock
->shouldReceive('latest')
->once()
->andReturnSelf();

$this->mock
->shouldReceive('get')
->once()
->andReturn(new Illuminate\Database\Eloquent\Collection);

如果需要,您还可以检查 View 是否已正确接收到变量:

$response = $this->call('GET', 'questions');

$this->assertViewHas('questions');

关于php - 尝试使用 IoC 容器在我的 Controller 测试中交换模型,但对象不是交换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28544252/

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