У нас есть метод контроллеров Laravel 5:
public function getInput() { $input = \Request::all(); $links = $input['links']; $this->startLinks = explode("\n", $links); return $this; }
Как мы можем протестировать этот единственный метод? Я не понимаю, как передать запрос POST с данными этому методу? И как создать экземпляр этого класса контроллера в моем методе тестирования?
Это похоже на метод, который, вероятно, не должен принадлежать контроллеру. Если вы серьезно относитесь к тестированию, я настоятельно рекомендую прочитать образец репозитория. При тестировании это сделает вашу жизнь намного легче, если все абстрагируется от контроллеров. =
С учетом сказанного, однако, это все еще очень проверяемо. Основная идея – выяснить, что нужно протестировать, и ТОЛЬКО проверить это. Это означает, что нам все равно, что делают зависимости, только то, что они делают, и возвращает то, что потребуется для остальной части метода. В этом случае это фасад Request
.
Затем вы хотите убедиться, что переменные установлены соответствующим образом и что метод возвращает экземпляр этого класса. На самом деле это довольно прямолинейно.
Должен выглядеть примерно так …
public function testGetInput() { $requestParams = [ 'links' => "somelink.com\nsomeotherlink.com\nandanotherlink.com\ndoesntmatter.com" ]; // Here we are saying the \Request facade should expect the all method to be called and that all method should // return some pre-defined things which we will use in our asserts. \Request::shouldReceive('all')->once()->andReturn($requestParams); // Here we are just using Laravel's IoC container to instantiate your controller. Change YourController to whatever // your controller is named $class = App::make('YourController'); // Getting results of function so we can test that it has some properties which were supposed to have been set. $return = $class->getInput(); // Again change this to the actual name of your controller. $this->assertInstanceOf('YourController', $return); // Now test all the things. $this->assertTrue(isset($return->startLinks)); $this->assertTrue(is_array($return->startLinks)); $this->assertTrue(in_array('somelink.com', $return->startLInks)); $this->assertTrue(in_array('nsomeotherlink.com', $return->startLInks)); $this->assertTrue(in_array('nandanotherlink.com', $return->startLInks)); $this->assertTrue(in_array('ndoesntmatter.com', $return->startLInks)); }
Я думаю, вы ищете это .
Если ваш тестовый класс расширяет TestCase
вы получите много вспомогательных методов, которые сделают тяжелый подъем для вас.
function testSomething() { // POST request to your controller@action $response = $this->action('POST', 'YourController@yourAction', ['links' => 'link1 \n link2']); // you can check if response was ok $this->assertTrue($response->isOk(), "Custom message if something went wrong"); // or if view received variable $this->assertViewHas('links', ['link1', 'link2']); }
Codeception расширяет эту функциональность еще больше.