Тестирование репозитория абстрактных документов, который взаимодействует с MongoDB
Привет всем,
У меня проблемы с настройкой теста. У меня есть простой проект Symfony 3, связанный с mongodb. У меня есть несколько документов, каждый из которых нуждается в дополнительном методе для запроса базы данных. Метод получит последний документ, вставленный в коллекцию, и будет вызван findLatestInserted()
,
Эта конкретная функция была продублирована в каждом хранилище документов. Поэтому я решил извлечь его и создать класс BaseDocumentRepository
который расширяет значение по умолчанию DocumentRepository
, Все мои репозитории документов все еще имеют свой собственный класс DocumentRepository, скажем так: CpuInfoRepository
, RamInfoRepository
, Эти классы предлагают несколько дополнительных методов для запроса к базе данных mongodb и один общий: findLatestInserted()
Все работает нормально, но на всякий случай я хотел написать модульный тест для этого метода findLatestInserted()
,
У меня есть тестовая база данных с именем prototyping-test, которая используется для создания документа, запроса к нему и проверки результата. После этого он очищается сам, поэтому никаких документов не остается. Для каждого хранилища есть определенный URL для публикации данных, чтобы создать файл в базе данных. Для создания коллекции CpuInfo вы будете публиковать данные на http://localhost:8000/ServerInfo/CreateCpuInfo
, Для создания коллекции RamInfo вы разместите данные на http://localhost:8000/ServerInfo/CreateRamInfo
,
Итак, вот мой вопрос, как бы я написал тест для проверки метода findLatestInserted()
?
это то, что я пробовал до сих пор:
public function testFindLatestInserted()
{
$client = self::createClient();
$crawler = $client->request('POST',
'/ServerInfo/CreateCpuInfo',
[
"hostname" => $this->hostname,
"timestamp" => $this->timestamp,
"cpuCores" => $this->cpuCores,
"cpu1" => $this->cpu1,
"cpu2" => $this->cpu2
]);
$this->assertTrue($client->getResponse()->isSuccessful());
$serializer = $this->container->get('jms_serializer');
$cpuInfo = $serializer->deserialize($client->getResponse()->getContent(), 'AppBundle\Document\CpuInfo', 'json');
$expected = $this->dm->getRepository("AppBundle:CpuInfo")->find($cpuInfo->getId());
$stub = $this->getMockForAbstractClass('BaseDocumentRepository');
$actual = $this->dm
->getRepository('AppBundle:CpuInfo')
->findLatestInserted();
$this->assertNotNull($actual);
$this->assertEquals($expected, $actual);
}
На линии $actual = $this->dm->getRepository('AppBundle:CpuInfo')->findLatestInserted();
я застрял. Так как это будет проверять только CpuInfo, пока есть RamInfo (и некоторые другие классы, не упомянутые здесь). Как можно подходить к этому параметру? Я специально хочу проверить метод findLatestInserted()
на уровне абстрактного класса вместо конкретных классов.
Пожалуйста, помогите мне!
1 ответ
Вместо того, чтобы тестировать весь стек, просто сконцентрируйтесь на тестировании findLatestInserted()
в конкретных классах.
Внедрить заглушку MondoDB в AppBundle:CpuInfo
и проверьте, если findLatestInserted()
возвращает ожидаемое значение. Сделать то же самое для AppBundle:RamInfo
,
Избегайте тестирования абстрактных классов, всегда проверяйте конкретные классы. В будущем вы можете решить не наследовать от BaseDocumentRepository
и может не заметить, что новая реализация findLatestInserted()
выходит из строя.