14

私は Symfony2 プロジェクトのテストに取り組んでいます。現在、エンティティ オブジェクトを永続化せずにテストを作成する方法を探しています。問題は、 idがプライベート フィールドであり、そのためのセッターがないことです。新しいオブジェクトを作成していくつかのプロパティを設定することはできますが、 getId()呼び出しに関連するものは何もテストできません。

$entity = new TheEntity();
// Can't set ID!
$entity->setProperty('propertyValue');

$name = $entity->getProperty(); // OK
$id = $entity->getId(); // not OK - null

私が知っている解決策:

  1. カーネル全体の初期化 (Symfony のWebTestCase::createKernel() ) とエンティティの永続化
  2. 有効な ID を返す、すべてのエンティティのモック オブジェクトの作成
  3. 初期化されたオブジェクトを返すTheEntityクラスの static メソッドのようなハック、またはidフィールドのセッターの追加

これに対処するための推奨される方法は何ですか? セット ID を使用して、クリーンで迅速な方法でテスト用のエンティティを取得する方法は?

編集

モックでこれを解決できることが判明しました...申し訳ありませんが、私はまだ学んでいます。私は物事を成し遂げるための、クリーンで標準的でありながら速い方法を探していました。ただし、 の 2 番目のパラメーターを忘れていました。getMock()つまり、使用するエンティティのすべてのメソッドをモックする必要はありません。複数などを避けたかったの->expects()->method()->will()ですが、これは次を追加することで実現されますarray('getId')。このヘルパー メソッドは問題を解決します。

protected function getEntityMock($entityClass, $id)
{
    $entityMock = $this->getMock($entityClass, array('getId'));
    $entityMock
            ->expects($this->any())
            ->method('getId')
            ->will($this->returnValue($id));

    return $entityMock;
}

同じクラスの多くのエンティティを作成する場合、もちろん、次のようなヘルパー メソッドを使用すると、さらに単純化できます。

protected function getTheEntityMock($id)
{
    return $this->getEntityMock('\The\NameSpace\TheEntity', $id);
}

唯一の制限は、エンティティ自体はidプロパティを使用できず、 getId()getter のみを使用できることです。

貴重な情報は引き続き歓迎しますが、PHPUnit はgetMock()これをうまく解決したと思います。

4

3 に答える 3

11

少し古いですが、リフレクションを使用してこれらの保護された値を変更するヘルパー メソッドを使用することが最善の方法であると言う価値があります。

例 :

public function set($entity, $value, $propertyName = 'id')
{
    $class = new ReflectionClass($entity);
    $property = $class->getProperty($propertyName);
    $property->setAccessible(true);

    $property->setValue($entity, $value);
}

それを拡張するか、それを持っている基本テストクラスに入れて、テストでtraitそのようなものが必要なときにそれを使用してください。そうすれば、汚い変更を作成することなくテストを書くことができます。

于 2016-12-12T11:16:24.997 に答える
5

もう 1 つの方法は、エンティティの子を作成し (クリーンな状態を保ちたい場合は、tests フォルダーに置くこともできます)、次に "setId()" メソッドを子に追加することです。

class TestableEntity extends \My\Namespace\Entity
{
    public function setId($id)
    {
       $this->id = $id;

       return $this;
    }
}

テストでは、実際のエンティティではなく、TestableEntity をテストする必要があります。\My\Namespace\Entity の「id」プロパティが非公開ではなく保護されている限り、TestableEntity を介して設定できます。

于 2014-09-25T09:34:52.823 に答える