我希望将测试框架合并到我正在构建的项目中并遇到Enhance PHP我喜欢但我在线查找相关信息有些困难,因为“增强php”是一种常用的短语。
是否有人使用此框架可能会指向我一些有用的指南?您是否使用过您认为更好的单元测试框架?
提前致谢。
在回应Gotzofter时,这是要测试的课程:
<?php
include_once('EnhanceTestFramework.php');
class ExampleClass
{
private $OtherClass;
function __construct($mock = null)
{
if ($mock == null)
$this->OtherClass = new OtherExampleClass();
else
$this->OtherClass = $mock;
}
public function doSomething()
{
return $this->OtherClass->getSomething(1, 'Arg2');
}
}
class OtherExampleClass
{
public function getSomething()
{
return "Something";
}
}
class ExampleClassTests extends \Enhance\TestFixture
{
public function setUp()
{
}
public function tearDown()
{
}
public function verifyWithAMock()
{
$mock = \Enhance\MockFactory::createMock('OtherExampleClass');
$mock->addExpectation(
\Enhance\Expect::method('getSomething')
->with(1, 'Arg2')
->returns('Something')
->times(1)
);
$target = new ExampleClass($mock);
$result = $target->doSomething();
\Enhance\Assert::areIdentical("Something", $result);
$mock->verifyExpectations();
}
}
\Enhance\Core::runTests();
查看ExampleClass的构造函数。
因为enhance-php的网站示例通过调用new ExampleClass($ mock)来注入$ mock对象,所以我不得不更改我的ExampleClass构造函数来处理$ mock作为输入参数。
对于我想要使用框架进行单元测试的所有类,我是否必须处理此问题?
感谢。
答案 0 :(得分:3)
此:
function __construct()
{
$this->OtherClass = new OtherExampleClass;
}
应该是:
function __construct($otherClass)
{
$this->OtherClass = $otherClass;
}
你的模拟在测试中从未被注入:
$target = new ExampleClass($mock);
答案 1 :(得分:1)
无论您使用什么测试框架,我都会建议您使用针对预期类或接口的类型提示。
<?php
class ExampleClass
{
private $OtherClass; // OtherClass instance
public function __construct(OtherClass $OtherClass=null)
{
// ...
}
}
我不是专家,但如果没有为特定依赖项提供实例,我没有看到让每个类调用 new 的问题。当然,您也可以采用使用setter方法配置依赖关系的方法。
<?php
class class ExampleClass
{
private $OtherClass; // OtherClass instance
public function setOtherClass(OtherClass $OtherClass)
{
$this->OtherClass = $OtherClass;
}
}
示例代码中的 ExampleClass 甚至没有定义 ExampleDependencyClassTests 中的 doSomething 方法,但是如果我明白了正确看起来像增强PHP 并没有强迫你采取特定的依赖注入风格。您可以根据需要编写测试类,例如,如果采用上面提到的setter方法方法,则可以将示例模拟代码更改为
<?php
class ExampleDependencyClassTests extends \Enhance\TestFixture
{
public function verifyWithAMock()
{
$mock = \Enhance\MockFactory::createMock('ExampleDependencyClass');
$mock->addExpectation(
\Enhance\Expect::method('getSomething')
->with(1, 'Arg2')
->returns('Something')
->times(1)
);
$target = new ExampleClass();
$target->setExampleDependencyClass($mock);
$result = $target->doSomething();
$mock->verifyExpectations();
}
}
当然,对 ExampleClass 进行适当的修改是很有意义的。
<?php
class ExampleClass
{
private $ExampleDependencyClass;
public function addTwoNumbers($a, $b)
{
return $a + $b;
}
public function setExampleDependencyClass(
ExampleDependencyClass $ExampleDependecyClass
) {
$this->ExampleDependecyClass = $ExampleDependecyClass;
}
public function doSomething($someArg)
{
return 'Something';
}
}
我已经与 PHPUnit 进行了相当多的工作,老实说,你必须面对与 Mocks 相同的挑战。我的2美分,尝试在没有 Mocks 的情况下为您的测试建模;如果可能的话;)
答案 2 :(得分:0)
有一个名为Testing Your PHP Codebase With Enhance PHP的NetTuts教程,肯定会帮助您入门。