2012-08-03 4 views
7

API에서 JSON 구조를 가져와 성공적인 응답에 특정 값의 두 가지 특정 특성이 있는지 확인해야합니다.개체의 여러 속성을 테스트하는 방법

주요 문제 :

    내가, 전체 객체를 비교할 수 없습니다
  1. 이 될 수 있기 때문에, 내가 (각 속성)이 개 테스트를 작성할 수 없습니다
  2. 각 요청에 따라 다를 수있는 몇 가지 특성이 있기 때문에 두 속성이 올바른 값과 일치 할 때만 성공적인 응답으로 간주됩니다.

예 성공적인 응답 :

{ 
    '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' 
    ); 
} 

될하지만, 더 청소기 솔루션이 있어야 있다고 생각?

+2

나는 꽤 깨끗해 보입니다. – Matt

+0

그 해결책은 테스트가 실패했다는 것을 말해 줄 수 있지만 정확히 무엇이 잘못되었는지를 말할 수는 없습니다. 그게 바로 내가 "더러운"것으로 생각하는 이유입니다. –

답변

0

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'; 
} 
0

이와 같은 경우 단일 테스트 방법으로 여러 개의 어설 션을 사용할 수 있습니다. 또한 더 나은 실패 메시지를 제공 할 수 있으므로 가능하면 assertEquals과 같은보다 구체적인 어설 션을 사용하십시오.

public function testAddAccount() { 
    $response = $this->api->addAccount('7629428643'); 

    self::assertTrue($response->success); 
    self::assertEquals('7629428643', $response->id); 
} 
0

답변에 언급 된대로 assertEquals() 메서드를 사용해야합니다. 두 번째 부분은 몇 가지 단정을 사용할 수 있다는 것입니다. 따라서 phpunit이 첫 번째 어설 션에서 실패를 감지하면 전체 테스트가 실패합니다.

assertTrue()을 사용하지 않는 이유는 무엇입니까? 예를 들어 코드 한 곳에서 if ($object) ...을 사용하고 다른 곳에서 assertTrue($object);을 사용하는지는 분명하지 않기 때문입니다.

또한 루틴이 올바르게 실행되는지 확인하십시오. 따라서 응답을 얻으려고 시도하는 동안 예외가 발생하면 테스트가 실패합니다. 예외는 테스트 케이스로도 검사해야합니다. 즉, 잘못된 요청을 게시하고 어설 션 예외가 발생해야합니다. 즉 테스트가 같은 모양을 좋은 -이

그래서, 이것은 당신이 가지고 있어야하는 코드입니다) = 도니는 다르게, 모든 가능한 상황을 확인해야합니다 : 당신은 확인하려는 각 속성에 대한 assertEquals()을 사용할

public function testAddAccount() { 
    $response = $this->api->addAccount('7629428643'); 

    $this->assertEquals($response->success, true); 
    $this->assertEquals($response->id, '7629428643'); 

    $this->setExpectedException('MyException'); 

    $response = $this->api->addAccount('wrong_account'); 
} 
2

가 . 일반적으로 각 테스트 케이스에서 한 가지만 테스트하기를 원하지만, "한 가지"를 테스트하기 위해서는 여러 개의 어설 션이 필요할 수 있습니다. 이런 이유로, 여러 단언은 괜찮습니다.

알림을 피하기 위해 $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); 
} 
+0

그래도 문제가되는 경우가 있습니다. 문제가 발생하면 문제가있는 첫 번째 주장이 실패하는 것으로 나타납니다. 문제를 해결하면 다른 문제를 보여줍니다. –

+0

이것은 사실이지만 어쨌든 한 번에 하나의 실패에만 집중하는 것이 가장 좋습니다. 첫 번째 오류를 수정해도 테스트 사례 내에서 남아있는 오류가 해결되는 경우는 드뭅니다. – JamesArmes

0

I (이 하지만 취향의 문제가) 두 개의 부울 표현식을 추가하고 결과를 주장하는 것입니다 생각할 수있는 가장 깨끗한 방법은 두 가지입니다 :

$r1=$response->success === TRUE; 
$r2=$response->id === '7629428643'; 
$this->assertEquals(2, $r1+$r2, "Expecting both values to match; got ($r1) and ($r2)"); 

물론이 설정을 배열 및 array_sum()==count()과 더 많은 사랑스러운 메시지로 확장 할 수 있습니다.

1

과도한 값을 무시하고 오른쪽 응답과의 차이를 계산합니다. 차이가 없다면 모든 것이 잘됩니다. 있다면, 당신은 완전한 정보를 얻을 것이다.

//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 (...)를, 배열()), 출력 실패의 차이, 또는 거의 어떤 선호하는 방법으로 처리해야한다.

관련 문제