我是测试的新手,并且正在努力弄清楚测试某些功能的内容和方法。
以此方法为例:
public static function generateResponse(array $result)
{
return new Response($result['body'], $result['headers'], $result['code']);
}
我应该测试什么?
首先想到的是我想确保数组具有所需的键。
并确保它返回一个Response对象。
有人为TestNoobie提供了一些提示:)
答案 0 :(得分:0)
不要编写测试,而是重构代码:
public static function createResponse($body, $headers, $code)
{
return new Response($body, $headers, $code);
}
并更改调用全局静态函数的所有位置。
由于代码已经运行(绿色),您停止测试并进行重构(蓝色)。
答案 1 :(得分:0)
您将检查是否返回了Response对象并且分配了正确的属性:
$body = 'body';
$headers = 'headers';
$code = 'code';
$response = Class::generateResponse(
array(
'body' => $body,
'headers' => $headers,
'code' => $code
)
);
$this->assertInstanceOf('Response', $response);
$this->assertEquals($body, $response->body);
$this->assertEquals($headers, $response->headers);
$this->assertEquals($code, $response->code);
这是测试方法的方法。我同意hakre的重构建议,但你问过如何测试你的方法。
另一点:静态方法会使您的代码不易测试,因为当您需要时,您将无法(轻松)用模拟替换真实对象或类。看看this good explanation。
答案 2 :(得分:0)
您无法在该特定方法中进行过多测试。
测试归结为编写调用生产代码函数的测试代码。在这里,您要编写一行来调用该静态方法。
然后,测试将检查是否确实返回了预期的返回值。在你的情况下,你展示的功能绝对没有办法做一些奇特的事情。它将接受您作为参数传递的数组,从中获取一些值,使用这些值创建一个Response
对象,然后将其返回。
从该类的外部开始,在测试中,您只能改变传递给函数的数组,并且期望始终获得类Response
的对象。我们无法看到你传递的参数是否会到达某个地方,如果你能检测到它们是否正确传递,但@gontrollez认为这可以通过检查一些公共属性来完成(他可能错了,他也不知道你的代码)。
因此,编写测试就像您第一次使用自己的生产代码一样。假设您要编写邮件地址验证程序。简单来说,用字符串(邮件地址)调用函数,对有效地址返回true,否则返回false。
您可以通过编写调试代码来测试您的函数,该代码调用具有多个工作邮件地址的验证程序,并期望true为返回值,以及几个应返回false的无效字符串。
您提供的代码存在问题:很难深入测试。它不允许对所有方面进行简单测试,只是为了测试应该检查返回对象的类的明显事实。测试细节会变得混乱。
因此,除了您是测试业务的初学者之外,您还选择了一个硬目标。我能理解你很困惑。
此外,您无法测试阵列是否具有所需的键。因为这必须在您的生产代码中进行,并且称为验证。如果您在静态函数中编写代码来检查数组键,并且如果它们不存在则会以某种方式失败(抛出异常),那么您的测试可以检查如果您无法传递所有数组键,是否真的抛出异常,那么如果一切正确,你会得到一个Response对象。