我为类本身编写了测试用例,以在给定所需参数的情况下返回数据,而不使用 Mocks。 Mocks 用于对此类的外部引用,需要知道函数 Bar() 返回 Foo,因此等待该响应的类会正确处理结果。
鉴于这个非常简单的 PHP 类:
<?php
class CATEGORY_SCOPE
{
public $CategoryName;
public $CategoryNo;
function __construct($CategoryNo = NULL, $CategoryName = NULL)
{
$this->CategoryName = $CategoryName;
$this->CategoryNo = $CategoryNo;
}
protected function SetCategoryName($Name)
{
$this->CategoryName = Name;
}
}
?>
然后我会测试它:
<?php
require_once(substr(__FILE__, 0, -5)); // strip '.test' extension
class TEST_CATEGORY_SCOPE extends PHPUnit_Framework_TestCase
{
protected function setUp()
{
}
public function testObjectCreation()
{
$CategoryInfo = new CATEGORY_SCOPE();
$this->assertInstanceOf('CATEGORY_SCOPE', $CategoryInfo);
}
public function testConstructFieldOrder()
{
$CategoryInfo = new CATEGORY_SCOPE(1500, 'Category Name');
$this->assertEquals(1500, $CategoryInfo->CategoryNo);
$this->assertEquals('Category Name', $CategoryInfo->CategoryName);
}
public function testConstructDefaults()
{
$CategoryInfo = new CATEGORY_SCOPE();
$this->assertNull($CategoryInfo->CategoryNo);
$this->assertNull($CategoryInfo->CategoryName);
}
public function testSetCategoryName()
{
$CategoryInfo = new CATEGORY_SCOPE();
$CategoryInfo->SetCategoryName('New Name');
$this->assertEquals('New Name', $CategoryInfo->CategoryName);
}
}
?>
这将测试该类本身是否有效,并且我可以设置某些值。显然这是一个简单的例子。现在,当某些东西使用这个类时,我仍然可以对字段设置进行目录测试,但这在此处进行了介绍。
那么,对于您的问题,假设我有类 FOO() 接受 CATEGORY_SCOPE 作为构造函数中的参数。您将模拟 CATEGORY_SCOPE 类,并设置内部 Bar() 函数以返回一些数据,而不管 CATEGORY_SCOPE 类进行的处理。
<?php
class FOO
{
public $ReturnValue
function __construct($CategoryScope)
{
$this->ReturnValue = $CategoryScope->Bar();
}
}
?>
通过模拟 CATEGORY_SCOPE 类,使 Bar() 函数始终返回 5(对您的代码有意义的某个值),然后您可以测试 FOO 类是否按预期工作。
<?php
require_once(substr(__FILE__, 0, -5)); // strip '.test' extension
class TEST_FOO extends PHPUnit_Framework_TestCase
{
protected function setUp()
{
}
public function testObjectCreation()
{
$FooInfo = new FOO();
$this->assertInstanceOf('FOO', $FooInfo);
}
public function testFoo()
{
// Set Up the Mock so Bar() returns 5 using your mock library
... <- Actual code for the mock goes here
$FooInfo = new FOO($CategoryMock);
$this->assertEquals(5, $FooInfo->Bar());
}
}
?>