ZF2 / PHPUnit:模拟 Zend/Db/Adapter/Adapter 以供进一步使用
ZF2 / PHPUnit: Mock a Zend/Db/Adapter/Adapter for further usage
目标:在 Zend Framework 2 中对 InputFilter 进行单元测试。
问题:需要模拟的 DbAdapter。
由于我对单元测试比较陌生,所以我刚开始模拟 classes。经过大量研究后,我仍然无法为我的问题找到合适的解决方案,所以在这里我们使用我的过滤器开始:
class ExampleFilter extends Inputfilter
{
protected $dbAdapter;
public function __construct(AdapterInterface $dbAdapter)
{
$this->dbAdapter = $dbAdapter;
}
public function init()
{
$this->add(
[
'name' => 'example_field',
'required' => true,
'filters' => [
['name' => 'StringTrim'],
['name' => 'StripTags'],
],
'validators' => [
[
'name' => 'Db\NoRecordExists',
'options' => [
'adapter' => $this->dbAdapter,
'table' => 'example_table',
'field' => 'example_field',
],
],
],
]
);
}
}
无需适配器,测试此过滤器会相当容易。我的问题是在我的 TestClass 中创建过滤器,如下所示:
class ExampleFilterTest extends \PHPUnit_Framework_TestCase
{
protected $exampleFilter;
protected $mockDbAdapter;
public function setUp()
{
$this->mockDbAdapter = $this->getMockBuilder('Zend\Db\Adapter')
->disableOriginalConstructor()
->getMock();
$this->exampleFilter = new ExampleFilter($this->mockDbAdapter);
}
}
像这样创建过滤器时,ExampleFilter class 最终会说我确实向其构造函数提供了错误的 class。当期望 Zend\Db\Adapter\Adapter.
类型之一时,它正在接收一个模拟对象
我当然可以创建一个真正的适配器,但我想避免对数据库执行实际查询,因为它是一个单元测试,这将远远超出我要测试的单元的范围。
谁能告诉我如何实现使用模拟 DbAdapter 测试过滤器的目标?
好吧...当我评论 gontrollez 提示时,我已经发现了我的错误。我必须创建一个 'Zend/Db/Adapter/AdapterInterface' 的模拟,而不仅仅是 '/Zend/Db/Adapter'。
感谢 gontrollez 让我走上了正确的道路:)
目标:在 Zend Framework 2 中对 InputFilter 进行单元测试。
问题:需要模拟的 DbAdapter。
由于我对单元测试比较陌生,所以我刚开始模拟 classes。经过大量研究后,我仍然无法为我的问题找到合适的解决方案,所以在这里我们使用我的过滤器开始:
class ExampleFilter extends Inputfilter
{
protected $dbAdapter;
public function __construct(AdapterInterface $dbAdapter)
{
$this->dbAdapter = $dbAdapter;
}
public function init()
{
$this->add(
[
'name' => 'example_field',
'required' => true,
'filters' => [
['name' => 'StringTrim'],
['name' => 'StripTags'],
],
'validators' => [
[
'name' => 'Db\NoRecordExists',
'options' => [
'adapter' => $this->dbAdapter,
'table' => 'example_table',
'field' => 'example_field',
],
],
],
]
);
}
}
无需适配器,测试此过滤器会相当容易。我的问题是在我的 TestClass 中创建过滤器,如下所示:
class ExampleFilterTest extends \PHPUnit_Framework_TestCase
{
protected $exampleFilter;
protected $mockDbAdapter;
public function setUp()
{
$this->mockDbAdapter = $this->getMockBuilder('Zend\Db\Adapter')
->disableOriginalConstructor()
->getMock();
$this->exampleFilter = new ExampleFilter($this->mockDbAdapter);
}
}
像这样创建过滤器时,ExampleFilter class 最终会说我确实向其构造函数提供了错误的 class。当期望 Zend\Db\Adapter\Adapter.
类型之一时,它正在接收一个模拟对象我当然可以创建一个真正的适配器,但我想避免对数据库执行实际查询,因为它是一个单元测试,这将远远超出我要测试的单元的范围。
谁能告诉我如何实现使用模拟 DbAdapter 测试过滤器的目标?
好吧...当我评论 gontrollez 提示时,我已经发现了我的错误。我必须创建一个 'Zend/Db/Adapter/AdapterInterface' 的模拟,而不仅仅是 '/Zend/Db/Adapter'。
感谢 gontrollez 让我走上了正确的道路:)