如何测试一个对象的多个属性
我从API获取JSON结构,并且需要检查成功响应是否具有具有特定值的两个特定属性。
关键问题:
示例成功响应:
{
'success': true,
'user_ip': '212.20.30.40',
'id': '7629428643'
}
肮脏的解决方案将是
<?php
public function testAddAccount() {
$response = $this->api->addAccount( '7629428643' );
$this->assertTrue(
$response->success === TRUE &&
$response->id === '7629428643'
);
}
但我认为必须有更好更清洁的解决方案,是吗?
你想为你想验证的每个属性使用assertEquals()
。 尽管您通常只想在每个测试用例中测试一件事情,但为了测试“一件事”,有时需要多个断言。 出于这个原因,多重断言是可以的。
您可能还想声明该属性存在于$response
对象上以避免通知。 有关示例,请参阅以下内容:
public function testAddAccount() {
// Attempt to create an account.
$response = $this->api->addAccount('7629428643');
// Verify that the expected properties are present in the response.
$this->assertObjectHasAttribute('success', $response);
$this->assertObjectHasAttribute('id', $response);
// Verify the values of the properties.
$this->assertEquals(true, $response->success);
$this->assertEquals('7629428643', $response->id);
}
计算响应和正确答案之间的差异,忽略任何过多的值。 如果没有区别,一切都很好; 如果有的话,你会得到完整的信息。
//some examples
$responseValues = array('success' => true, 'user_ip' => '212.20.30.40', 'id' => '7629428643'); //success
$errorResponseValues = array('success' => false, 'user_ip' => '212.20.30.40', 'id' => '7629428643'); //failure
$errorResponseValues2 = array('success' => false, 'user_ip' => '212.20.30.40', 'id' => '123'); //failure
$expectedValues = array('success' => true, 'id' => '7629428643'); //what is success
function whatIsWrong($reality, $expectation)
{
return array_uintersect_assoc($reality, $expectation, function($a, $b){return (int)($a == $b);}); //This is slightly dirty, I think the final implementation is up to you
}
var_dump(whatIsWrong($responseValues, $expectedValues)); //array()
var_dump(whatIsWrong($errorResponseValues, $expectedValues)); //array('success' => false)
var_dump(whatIsWrong($errorResponseValues2, $expectedValues)); //array('success' => false, id => 123)
然后你可以使用assertEqual(whatIsWrong(...),array()),它应该在失败时输出差异,或者以几乎任何首选的方式处理它。
如果assertTrue()
存储成功响应的布尔值,那么我将如何处理它。 请记住,这是一个品味问题 。
private $lastResponse;
// $id given elsewhere
public function testAddAccount($id) {
$this->lastResponse = $this->addAccount($id);
}
private function addAccount($id) {
return $this->api->addAccount($id);
}
private function isLastResponseValid($response){
return $this->lastResponse->success === TRUE
&& $this->lastResponse->id === '7629428643';
}
链接地址: http://www.djcxy.com/p/11077.html