2013-03-27 41 views
0

我开始写phpUnit测试并面临这样的问题。我的80%功能以这样的行结束PhpUnit检查输出文本

$data["res"] = $this->get_some_html($this->some_id); 
    echo my_json_encode($data); 
    return true; 

我该如何在我的类中对这类函数进行测试?

+0

是否有一个原因,你只是打印并没有返回值? – Uby 2013-03-27 16:36:03

+0

Ofc,我以这种方式做AJAX响应。 – 2013-03-27 16:38:47

+0

但是,为什么不只是返回值,然后打印?像'echo myFunction()'而不是只调用'myFunction()'? – Uby 2013-03-27 16:41:08

回答

2

您需要将您的代码隔离为可测试的“块”。您可以测试该函数在给定指定文本的情况下返回TRUE/FALSE,然后测试给定固定信息的JSON返回数据。

function my_json_encode($data) 
{ 
    return ...; 
} 

function get_some_html($element) 
{ 
    return ...; 
} 

function element_exists($element) 
{ 
    return ..; 
} 

function display_data($element) 
{ 
    if(element_exists($element) 
    { 
     $data = get_some_html($element); 
     $json = my_json_encode($data); 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
}  

测试:

public function test_my_json_encode() 
{ 
    $this->assertEquals($expected_encoded_data, my_json_encode($text)); 
} 

public function test_get_some_html() 
{ 
    $this->assertEquals($expected_html, get_some_html('ExistingElementId')); 
} 

public function test_element_exists() 
{ 
    $this->assertTrue(element_exists('ExistingElementId'); 
    $this->assertFalse(element_exists('NonExistingElementId'); 
} 

function test_display_data() 
{ 
    $this->assertTrue(display_data('ExistingElementId')); 
    $this->assertFalse(element_exists('NonExistingElementId'); 
}  

这其中的变化和测试一个简单的,抽象的例子。正如上面的评论所指出的,你可能想要将返回值改为JSON文本,出错时为FALSE,然后在代码中使用===测试来决定是否显示文本。

下一步将是模拟元素,以便您可以获得预期的数据而不需要真正的HTML页面。