我如何模拟一个应该接受数组的方法?
How can I mock a method that should accept an array?
我刚开始使用 PHPUnit 进行测试,我想做的是测试一个名为 returnOnLogin()
的方法,该方法接受参数 Enlight_Event_EventArgs $args
和 returns true
.
这是我要测试的方法:
public function returnOnLogin(\Enlight_Event_EventArgs $args)
{
$controller = $args->get('subject');
$view = $controller->View();
$controller->redirect([
'controller' => 'verification'
]);
// $view->addTemplateDir(
// __DIR__ . '/Views'
// );
return true;
}
这是我的测试:
class MyFirstTestPluginTest extends TestCase
{
public function testReturnOnLogin()
{
$my_plugin = new MyFirstTestPlugin(true);
$expected = true;
//I tried following but it did not work
$this->assertEquals($expected, $my_plugin->returnOnLogin(//here is the problem it requires this array that I dont know));
}
}
假设你的控制器 class 是 Controller
,并且假设我们不关心 view()
在 $controller
中被调用,这应该涵盖你是什么寻找:
class MyFirstTestPluginTest extends TestCase
{
public function testReturnOnLogin()
{
/**
* create a test double for the controller (adjust to your controller class)
*/
$controller = $this->createMock(Controller::class);
/**
* expect that a method redirect() is called with specific arguments
*/
$controller
->expects($this->once())
->method('redirect')
->with($this->identicalTo([
'controller' => 'verification'
]));
/**
* create a test double for the arguments passed to returnLogin()
*/
$args = $this->createMock(\Enlight_Event_EventArgs::class);
/**
* expect that a method subject() is invoked and return the controller from it
*/
$args
->expects($this->once())
->method('subject')
->willReturn($controller);
$plugin = new MyFirstTestPlugin(true);
$this->assertTrue($plugin->returnOnLogin($args));
}
}
这个测试是做什么的?
排列
此测试首先 安排 测试双打以用于被测系统(您的插件)。
第一个测试替身是您的控制器,我们将其设置为我们希望使用与指定数组相同的参数调用一次方法 redirect()
。
第二个测试替身是参数,我们以这样一种方式设置它,即我们期望调用方法“subject()”,并将 return 控制器。
然后,我们设置被测系统,只需创建 MyFirstTestPlugin
的实例,将 true
传递给构造函数。
很遗憾,您没有与我们共享构造函数,我们不知道参数 true
代表什么。如果它影响 returnLogin()
的行为,那么我们显然需要添加更多测试来断言参数采用不同值时的行为。
行动
然后这个测试在被测系统上调用方法returnLogin()
,并传入其中一个测试替身。
断言
最终,该测试断言方法 returnLogin()
returns true
。
注意看看
我刚开始使用 PHPUnit 进行测试,我想做的是测试一个名为 returnOnLogin()
的方法,该方法接受参数 Enlight_Event_EventArgs $args
和 returns true
.
这是我要测试的方法:
public function returnOnLogin(\Enlight_Event_EventArgs $args)
{
$controller = $args->get('subject');
$view = $controller->View();
$controller->redirect([
'controller' => 'verification'
]);
// $view->addTemplateDir(
// __DIR__ . '/Views'
// );
return true;
}
这是我的测试:
class MyFirstTestPluginTest extends TestCase
{
public function testReturnOnLogin()
{
$my_plugin = new MyFirstTestPlugin(true);
$expected = true;
//I tried following but it did not work
$this->assertEquals($expected, $my_plugin->returnOnLogin(//here is the problem it requires this array that I dont know));
}
}
假设你的控制器 class 是 Controller
,并且假设我们不关心 view()
在 $controller
中被调用,这应该涵盖你是什么寻找:
class MyFirstTestPluginTest extends TestCase
{
public function testReturnOnLogin()
{
/**
* create a test double for the controller (adjust to your controller class)
*/
$controller = $this->createMock(Controller::class);
/**
* expect that a method redirect() is called with specific arguments
*/
$controller
->expects($this->once())
->method('redirect')
->with($this->identicalTo([
'controller' => 'verification'
]));
/**
* create a test double for the arguments passed to returnLogin()
*/
$args = $this->createMock(\Enlight_Event_EventArgs::class);
/**
* expect that a method subject() is invoked and return the controller from it
*/
$args
->expects($this->once())
->method('subject')
->willReturn($controller);
$plugin = new MyFirstTestPlugin(true);
$this->assertTrue($plugin->returnOnLogin($args));
}
}
这个测试是做什么的?
排列
此测试首先 安排 测试双打以用于被测系统(您的插件)。
第一个测试替身是您的控制器,我们将其设置为我们希望使用与指定数组相同的参数调用一次方法 redirect()
。
第二个测试替身是参数,我们以这样一种方式设置它,即我们期望调用方法“subject()”,并将 return 控制器。
然后,我们设置被测系统,只需创建 MyFirstTestPlugin
的实例,将 true
传递给构造函数。
很遗憾,您没有与我们共享构造函数,我们不知道参数 true
代表什么。如果它影响 returnLogin()
的行为,那么我们显然需要添加更多测试来断言参数采用不同值时的行为。
行动
然后这个测试在被测系统上调用方法returnLogin()
,并传入其中一个测试替身。
断言
最终,该测试断言方法 returnLogin()
returns true
。
注意看看