以 Silex\Application 作为参数的单元测试方法
Unit test method with Silex\Application as parameter
在我的项目中,我有一个 class SessionManager,它设置和清除粘性表单等的会话变量。class 中的每个方法都接受一个 Silex\Application 对象作为参数。我如何对这些方法进行单元测试?在每个测试方法中创建一个 Silex 应用程序对象?
我是 Silex 和单元测试的新手,所以不确定如何处理。
一种方法的示例:
public static function setMessage($message, $messageClass, Application &$app)
{
// store message as array, with content and class keys
$app['session']->set('message', array(
'content' => $message,
'class' => $messageClass
));
}
首先我认为 $app
不应该是你的 SessionManager 的依赖; $app['session']
应该是。但它也应该是 object 的依赖项(即:传递给构造函数)而不是单个方法的依赖项。
但这并没有改变解决问题的策略。您需要做的就是创建一个 Session 的模拟,它覆盖了您需要调用的依赖方法,例如:
// in your test class
// ...
public function setup(){
$mockedSession = $this->getMockedSession();
$this->sessionManager = new SessionManager($mockedSession);
}
public function testMessage(){
// test stuff here
}
private function getMockedSession(){
$mockedSession = $this->getMockBuilder('\Symfony\Component\HttpFoundation\Session\Session')
->disableOriginalConstructor()
->setMethods(['set'])
->getMock();
$mockedSession->method('set')
->willReturn('something testable');
return $mockedSession;
}
您可能只需要测试您的 setMessage
方法是否将其 $message
和 $messageClass
值传递给模拟方法:这就是它所做的全部。从这个角度来看,您可能也想在模拟中加入 ->with('message', [$testMessage, $testClass])
或其他内容。确切的实现取决于您要如何测试。
在我的项目中,我有一个 class SessionManager,它设置和清除粘性表单等的会话变量。class 中的每个方法都接受一个 Silex\Application 对象作为参数。我如何对这些方法进行单元测试?在每个测试方法中创建一个 Silex 应用程序对象? 我是 Silex 和单元测试的新手,所以不确定如何处理。
一种方法的示例:
public static function setMessage($message, $messageClass, Application &$app)
{
// store message as array, with content and class keys
$app['session']->set('message', array(
'content' => $message,
'class' => $messageClass
));
}
首先我认为 $app
不应该是你的 SessionManager 的依赖; $app['session']
应该是。但它也应该是 object 的依赖项(即:传递给构造函数)而不是单个方法的依赖项。
但这并没有改变解决问题的策略。您需要做的就是创建一个 Session 的模拟,它覆盖了您需要调用的依赖方法,例如:
// in your test class
// ...
public function setup(){
$mockedSession = $this->getMockedSession();
$this->sessionManager = new SessionManager($mockedSession);
}
public function testMessage(){
// test stuff here
}
private function getMockedSession(){
$mockedSession = $this->getMockBuilder('\Symfony\Component\HttpFoundation\Session\Session')
->disableOriginalConstructor()
->setMethods(['set'])
->getMock();
$mockedSession->method('set')
->willReturn('something testable');
return $mockedSession;
}
您可能只需要测试您的 setMessage
方法是否将其 $message
和 $messageClass
值传递给模拟方法:这就是它所做的全部。从这个角度来看,您可能也想在模拟中加入 ->with('message', [$testMessage, $testClass])
或其他内容。确切的实现取决于您要如何测试。