Тестирование репозитория абстрактных документов, который взаимодействует с 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() выходит из строя.

Другие вопросы по тегам