7

API から JSON 構造を取得していますが、成功した応答に特定の値を持つ 2 つの特定の属性があるかどうかを確認する必要があります。

主な問題:

  1. リクエストごとに異なるプロパティがいくつかあるため、オブジェクト全体を比較することはできません
  2. 両方の属性が正しい値に一致する場合にのみ成功応答と見なすことができるため、(属性ごとに) 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'
    );
}

しかし、より良い、よりクリーンなソリューションが必要だと思います。

4

6 に答える 6

2

assertEquals()検証する各プロパティに使用します。通常、各テスト ケースで 1 つのことだけをテストする必要がありますが、その "1 つのこと" をテストするために複数のアサーションが必要になる場合があります。このため、複数のアサーションは問題ありません。

$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);
}
于 2012-08-21T15:40:35.050 に答える
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(...), array()) を使用できます。これは、失敗時に違いを出力するか、ほとんど任意の方法で処理する必要があります。

于 2012-08-26T22:44:51.777 に答える
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';
}
于 2012-08-03T14:04:10.160 に答える
0

このような場合、1 つのテスト メソッドで複数のアサーションを使用できます。また、可能な限り、より具体的なアサーションなどを使用してassertEqualsください。これにより、より適切なエラー メッセージが提供されます。

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

    self::assertTrue($response->success);
    self::assertEquals('7629428643', $response->id);
}
于 2012-08-06T09:33:59.590 に答える
0

いくつかの回答で述べたように、assertEquals()メソッドを使用する必要があります。2 番目の部分は、いくつかのアサーションを使用する可能性があるということです。したがって、phpunit が最初のアサーションで失敗を検出すると、テスト全体が失敗します。

なぜ使用しないのassertTrue()ですか?たとえば、if ($object) ...コードのある場所で使用しassertTrue($object);、別の場所で使用するかどうかは明確ではないためです。

また、ルーチンが正しく実行されることを確認してください。したがって、応答を取得しようとしているときに例外が発生すると、テストは失敗します。例外はテストケースとしてもチェックする必要があります。つまり、間違ったリクエストを投稿してみて、例外がスローされることをアサートする必要があります。それが良いテストの様子です - 考えられるすべての状況をチェックする必要があります.hehe =)

したがって、これは取得する必要があるコードです。

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');
}
于 2012-08-17T17:13:04.550 に答える
0

私が考えることができる最もクリーンな方法 (これ好みの問題ですが) は、2 つのブール式を追加し、結果が 2 であると断言することです。

$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()、さらに愛すべきメッセージを使用して、任意の数のテストに拡張できます。

于 2012-08-26T22:07:06.097 に答える