我应该测试什么? PHPUnit的

时间:2014-05-07 22:05:50

标签: php testing phpunit

我是测试的新手,并且正在努力弄清楚测试某些功能的内容和方法。

以此方法为例:

public static function generateResponse(array $result)
{

    return new Response($result['body'], $result['headers'], $result['code']);

}
我应该测试什么? 首先想到的是我想确保数组具有所需的键。

并确保它返回一个Response对象。

有人为TestNoobie提供了一些提示:)

3 个答案:

答案 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对象。