Коллекция доктрин изменена другим запросом на выборку - PullRequest
1 голос
/ 11 декабря 2010

Я новичок в модульном тестировании в Symfony, и это довольно раздражает, так как я столкнулся с одной проблемой, которая заняла у меня 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');

Второй тест не пройден:

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 содержит два созданных мной объекта «Note» (с именами «Test Note» и «Test Note2») и после второго , он просто содержит «Test Note» («Test Note2», похоже, был удален вторым запросом).

Так что мне интересно, почему это так работает, и если это способ исправить это.

Кто-нибудь из вас знает об этом странном поведении?

1 Ответ

0 голосов
/ 12 декабря 2010

Вот моя гипотеза: в обоих запросах вы получаете один и тот же Tadalist объект (идентифицируемый одним и тем же первичным ключом). Doctrine, вероятно, использует ссылку на один и тот же объект в обеих коллекциях. Второй запрос перезаписывает заметки, возвращаемые первым запросом.

Примечание : это всего лишь гипотеза. Пожалуйста, проверьте, если это действительно происходит.

...