2014-05-07 72 views
0

我是新来测试,并有一些困难,找出什么以及如何测试一些功能。我应该测试什么? PhpUnit

采取此法,因为en例如:

public static function generateResponse(array $result) 
{ 

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

} 

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

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

有人具有用于TestNoobie一些提示:)

+0

那么这是非常广泛和基于意见的问题。在我看来,100%的代码覆盖率并不那么重要。例如,在测试简单的getter和setter时没有意义,您想要测试代码的哪些部分存在或可能会出现错误。对于这个例子来说,测试这个数组需要的键并不是真的有意义 - array是你的输入,你应该检查你的响应对象是否与输入有关。 – Mikk

回答

0

你不能真的在那个特定的方法中测试。

测试归结为编写调用您的生产代码的函数测试代码。在这里,你会写一行来调用这个静态方法。

然后测试会检查预期的返回值是否真的返回。就你而言,你展示的功能绝对没有办法做一些奇特的事情。它将接受你作为参数传递的数组,从中获取一些值,用这些值创建一个Response对象,并返回它。

从这个类的外部,在你的测试中,你只能改变你传递给函数的数组,而你的期望是总是得到一个类Response的对象。我们看不到你传递的参数是否会到达某个位置,如果你能检测它们是否正确传递,但@gontrollez认为这可以通过检查一些公共属性来完成(他可能是错的,他也不知道你的代码)。

所以写测试就像是你用你自己的生产代码中的第一次。假定你想写一个邮件地址验证器。简单的说,用一个字符串(邮件地址)调用一个函数,然后返回真实的地址,否则返回false。

你会通过编写调用验证与几个工作电子邮件地址,并希望作为返回值,而应返回false几个无效的字符串真正的测试代码测试功能。

与您的代码你给我的问题:这是很难深入测试。它不允许对所有方面进行简单的测试,只是因为测试应该检查返回对象的类。测试细节会变得混乱。

所以,除了你在测试业务的初学者,你也选择了一个硬目标。我可以理解你很困惑。

此外,您不能测试该数组是否具有所需的键。因为这必须发生在您的生产代码中,并且它被称为验证。如果你在你的静态函数中编写代码来检查数组键值,如果它们不在那里(抛出一个异常)会失败,那么你的测试可以检查是否真的抛出异常,如果你不能传递所有的数组键值,如果一切正确,你会得到一个Response对象。

0

不要写测试,重构代码来代替:

public static function createResponse($body, $headers, $code) 
{ 
    return new Response($body, $headers, $code); 
} 

,并更改其中,全球静态函数被调用的所有地方。

由于代码已经工作(绿色),你停止与测试,你做的重构(蓝色)。

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

相关问题