首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何测试对象的多个属性

如何测试对象的多个属性
EN

Stack Overflow用户
提问于 2012-08-03 05:46:45
回答 6查看 1.9K关注 0票数 7

我从一个API中获得了一个JSON结构,并且需要检查成功响应是否有两个具有特定值的特定属性。

关键问题:

  1. 我不能比较整个对象,因为有一些属性,这些属性可能随每个请求而变化。
  2. 我不能为每个属性编写两个测试,因为只有当两个属性匹配正确的值时,它才能被认为是成功的响应。

成功响应实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    'success': true,
    'user_ip': '212.20.30.40',
    'id': '7629428643'
}

肮脏的解决办法是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
public function testAddAccount() {
    $response = $this->api->addAccount( '7629428643' );

    $this->assertTrue(
        $response->success === TRUE &&
        $response->id === '7629428643'
    );
}

但我认为必须有更好和更清洁的解决办法,是吗?

EN

回答 6

Stack Overflow用户

发布于 2012-08-21 07:40:35

您希望对要验证的每个属性使用assertEquals()。虽然您通常只想在每个测试用例中测试一件东西,但有时需要多个断言来测试“一件事”。因此,多个断言是可以的。

您还可能希望断言属性存在于$response对象中,以避免通知。有关示例,请参见以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);
}
票数 2
EN

Stack Overflow用户

发布于 2012-08-26 14:44:51

计算响应和正确答案之间的差异,忽略任何过量的值。如果没有区别,一切都会好的;如果有,你就会得到完整的信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//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()),它应该在失败时输出差异,或者以几乎任何首选的方式处理它。

票数 1
EN

Stack Overflow用户

发布于 2012-08-03 06:04:10

如果assertTrue()存储继承完整响应的布尔值,这就是我处理它的方式。请记住,这是一个味觉的问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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';
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11797030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文