Мне было интересно, сталкивался ли кто-нибудь еще с этой проблемой. Я просматриваю книгу Джеффри Уэя по тестированию в Laravel и читаю главу, в которой объясняется, как тестировать контроллеры.
Когда я следую примерам из книги - я получаю сообщение:
Не удалось подтвердить, что объект Illuminate\Http\Response (...) является экземпляром класса «Illuminate\Http\RedirectResponse».
Мой тест выглядит следующим образом:
public function testStoreFails()
{
$input = ['title' => ''];
$this->mock
->shouldReceive('create')
->once()
->with($input);
$this->app->instance('Post', $this->mock);
$this->post('posts', $input);
$this->assertRedirectedToRoute('posts.create');
$this->assertSessionHasErrors(['title']);
}
И очень простой метод в контроллере (только для проверки этого конкретного сценария):
public function create()
{
$input = Input::all();
$validator = Validator::make($input, ['title' => 'required']);
if ($validator->fails()) {
return Redirect::route('posts.create')
->withInput()
->withErrors($validator->messages());
}
$this->post->create($input);
return Redirect::route('posts.index')
->with('flash', 'Your post has been created!');
}
Из того, что я вижу, AssertionsTrait::assertRedirectedTo
проверяет, например, Illuminate\Http\RedirectResponse
/**
* Assert whether the client was redirected to a given URI.
*
* @param string $uri
* @param array $with
* @return void
*/
public function assertRedirectedTo($uri, $with = array())
{
$response = $this->client->getResponse();
$this->assertInstanceOf('Illuminate\Http\RedirectResponse', $response);
$this->assertEquals($this->app['url']->to($uri), $response->headers->get('Location'));
$this->assertSessionHasAll($with);
}
/**
* Assert whether the client was redirected to a given route.
*
* @param string $name
* @param array $parameters
* @param array $with
* @return void
*/
public function assertRedirectedToRoute($name, $parameters = array(), $with = array())
{
$this->assertRedirectedTo($this->app['url']->route($name, $parameters), $with);
}
который должен работать нормально, поскольку фасад Redirect разрешается в Illuminate\Routing\Redirector
, а его метод route()
вызывает createRedirect()
, который возвращает экземпляр Illuminate\Http\RedirectResponse
, поэтому не совсем уверен, что его вызывает.
ОБНОВЛЕНИЕ:
Только что еще раз проверил код, и похоже, что проблема в методе AssertionsTrait::assertRedirectedTo()
. Вызов $this->client->getResponse()
возвращает экземпляр Illuminate\Http\Response
вместо Illuminate\Http\RedirectResponse
, следовательно, вызов $this->assertInstanceOf('Illuminate\Http\RedirectResponse', $response)
завершается ошибкой. Но я до сих пор не уверен, почему - я расширяю TestCase
, который должен позаботиться обо всех настройках среды и т. Д. Есть идеи?
$this->post('posts', $input);
вызывает не ваш методcreate()
, а ваш методstore()
. Так что взгляните на него, если его там нет, вы, вероятно, просто получаете ответ 404, который не является перенаправлением. - person Quasdunk   schedule 18.01.2015