如何测试 Laravel 5 控制器方法
How to test Laravel 5 controllers methods
我们有 Laravel 5 控制器方法:
public function getInput()
{
$input = \Request::all();
$links = $input['links'];
$this->startLinks = explode("\n", $links);
return $this;
}
我们如何测试这个单一的方法?如何将带有数据的 POST 请求传递给此方法?以及如何在我的测试方法中创建此控制器的实例 class?
这看起来像是一种可能不应该属于控制器的方法。如果您认真对待测试,我强烈建议您阅读存储库模式。测试时,将所有内容从控制器中抽象出来会让您的生活变得更加轻松。=
尽管如此,这仍然是非常可测试的。主要思想是找出需要测试的内容并只测试它。这意味着我们不关心依赖项在做什么,只关心它们在做什么并返回方法的其余部分需要的东西。在本例中,它是 Request
门面。
然后您要确保正确设置了变量,并且该方法返回了该 class 的一个实例。它实际上最终非常简单。
应该看起来像这样...
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));
}
我想你正在寻找 this。
如果您的测试 class 扩展 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 进一步扩展了此功能。
我们有 Laravel 5 控制器方法:
public function getInput()
{
$input = \Request::all();
$links = $input['links'];
$this->startLinks = explode("\n", $links);
return $this;
}
我们如何测试这个单一的方法?如何将带有数据的 POST 请求传递给此方法?以及如何在我的测试方法中创建此控制器的实例 class?
这看起来像是一种可能不应该属于控制器的方法。如果您认真对待测试,我强烈建议您阅读存储库模式。测试时,将所有内容从控制器中抽象出来会让您的生活变得更加轻松。=
尽管如此,这仍然是非常可测试的。主要思想是找出需要测试的内容并只测试它。这意味着我们不关心依赖项在做什么,只关心它们在做什么并返回方法的其余部分需要的东西。在本例中,它是 Request
门面。
然后您要确保正确设置了变量,并且该方法返回了该 class 的一个实例。它实际上最终非常简单。
应该看起来像这样...
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));
}
我想你正在寻找 this。
如果您的测试 class 扩展 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 进一步扩展了此功能。