Я пытаюсь использовать контейнер 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());
}
}
Все идет нормально? Ниже мой QuestionsController:
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. Был бы очень признателен за любую помощь в этом.
QuestionsController
напрямую и передал зависимость. - person Matthew   schedule 27.02.2015