1

私は symfony での単体テストは初めてで、特定するのに 1 時間かかった 1 つの問題が発生したため、かなり面倒です。

うまくいけば、皆さんはなぜこれが起こるのかを知っているでしょう.

だから私は私の「検索」方法をテストしています:

class TadalistTable extends Doctrine_Table
{
  public function search($query, $user_id)
  {
     $q = $this->createQuery('t')
     ->leftJoin('t.Notes n')
     ->where('n.name LIKE ?', '%'.$query.'%')
     ->andWhere('t.user_id = ?', $user_id);
     return $q->execute();
  }
}

私のウェブサイトでは問題なく動作しますが、次のようにテストすると:

//Create two notes, one called "Test Note" and one called "Test Note2" in the same list

//Start test :
$searchTest = Doctrine_Core::getTable('Tadalist')->search('Test', $user->getId());
$searchNote2 = Doctrine_Core::getTable('Tadalist')->search('noTe2', $user->getId());

$t->is(count($searchTest), 1, 'Searching "Test" returned 1 list');
$t->is(count($searchTest[0]->Notes), 2, 'Searching "Test" returned 2 notes');
$t->is(count($searchNote2), 1, 'Searching "noTe2" returned 1 list');
$t->is(count($searchNote2[0]->Notes), 1, 'Searching "noTe2" returned 1 note');

2 番目のテストは失敗します。

ok 20 - Searching Test returned 1 list
not ok 21 - Searching Test returned 2 notes
# Failed test (./test/unit/Model/TadalistTest.php at line 90)
# got: 1
# expected: 2
ok 22 - Searching noTe2 returned 1 list
ok 23 - Searching noTe2 returned 1 note

しかし、順序を変更しただけの場合:

//Create two notes, one called "Test Note" and one called "Test Note2" in the same list

$searchTest = Doctrine_Core::getTable('Tadalist')->search('Test', $user->getId());
$t->is(count($searchTest), 1, 'Searching "Test" returned 1 list');
$t->is(count($searchTest[0]->Notes), 2, 'Searching "Test" returned 2 notes');

$searchNote2 = Doctrine_Core::getTable('Tadalist')->search('noTe2', $user->getId());
$t->is(count($searchNote2), 1, 'Searching "noTe2" returned 1 list');
$t->is(count($searchNote2[0]->Notes), 1, 'Searching "noTe2" returned 1 note');

できます :

ok 13 - Searching Test returned 1 list
ok 14 - Searching Test returned 2 notes
ok 15 - Searching noTe2 returned 1 list
ok 16 - Searching noTe2 returned 1 note

デバッグ後、最初のクエリの後、searchTest[0]->Notes には、作成した 2 つの「メモ」オブジェクト (「Test Note」および「Test Note2」という名前) が含まれていることがわかりました。 「Test Note」が含まれています (「Test Note2」は 2 番目のクエリで削除されたようです)。

なぜこのように機能しているのか、それを修正する方法があるのか​​ 疑問に思っています。

この奇妙な動作について知っている人はいますか?

4

1 に答える 1

0

これが私の仮説です。どちらのクエリでも、同じTadalistオブジェクト(同じ主キーで識別される)を取得しています。Doctrineはおそらく両方のコレクションで同じオブジェクトへの参照を使用します。2番目のクエリは、最初のクエリによって返されたメモを上書きします。

:これは単なる仮説です。それが実際に発生するかどうかを確認してください。

于 2010-12-12T14:32:58.723 に答える