- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个包含一些逻辑的方法,但我不确定如何对其进行单元测试。因为它是针对此特定方法的单元测试,所以它应该在不连接到数据库的情况下运行。我阅读了有关 stub 和模型的信息,但找不到将它们应用于这种情况的方法。
我想强制 Client:GetClient 返回具有正确属性的客户端对象,以便我可以测试每个逻辑分支。
class ClientType {
function GetClientType($id) {
$objClient = Client::GetClient($id);
if ($objClient->Returning == 1) {
return 'returning';
}
else {
return 'normal';
}
}
这是我想到的测试
class ResourceTest extends PHPUnit_Framework_TestCase {
function testGetClientType() {
$objClientType = new ClientType();
$this->assertTrue($objClientType->GetClientType(100), 'normal');
}
}
问题是依赖关系 $objClient = Client::GetClient($id); GetClient 将从数据库中提取客户端,但我需要将其替换为 stub ,以便单元测试无需真正访问数据库即可工作。
最佳答案
与 PHPUnit你可以做到
$class = $this->getMockClass(
'Client', /* name of class to mock */
array('getClient') /* list of methods to mock */
);
$class::staticExpects($this->any())
->method('getClient')
->will($this->returnValue('foo'));
但一般来说,您希望避免使用静态方法:
更新后编辑
PHPUnit 还可以 stub 硬编码的依赖项。见
但是,由于您现在已经注意到测试静态和硬编码依赖关系是一种背后的痛苦,我建议您移除硬编码依赖关系和静态调用,改为使用注入(inject)到 ClientType 中的真实对象。
另一种选择是使用 http://antecedent.github.io/patchwork (不隶属于它),
is a PHP library that makes it possible to redefine user-defined functions and methods at runtime, loosely replicating the functionality runkit_function_redefine in pure PHP 5.3 code, which, among other things, enables you to replace static and private methods with test doubles.
关于php - 如何在 PHP 中对具有依赖关系的方法进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5561702/
我是一名优秀的程序员,十分优秀!