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

我从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

    上一篇: How to test multiple properties of an object

    下一篇: set text to google+ share button