Я пытаюсь выполнить модульное тестирование моих методов mongodb, поэтому мне нужен метод tearDown () для очистки всей базы данных mongo после тестирования.
Вот функция:
public function tearDown()
{
$databases = $this->mongoClient->listDatabases();
foreach ($databases as $db) {
$db.dropDatabase();
}
}
Однако он не может увидеть метод на моем $ db.
Error: Call to undefined function Api\Test\Unit\dropDatabase()
Кажется, listDatabases () возвращает только некоторую информационную модель моих баз данных, а не сами базы данных:
/var/www/html/tests/backend/Service/MongoStorageTest.php:35:
class MongoDB\Model\DatabaseInfo#1563 (3) {
public $name =>
string(5) "local"public $sizeOnDisk =>
double(83886080)
public $empty =>
bool(false)
}
/var/www/html/tests/backend/Service/MongoStorageTest.php:35:
class MongoDB\Model\DatabaseInfo#1483 (3) {
public $name =>
string(2) "db"public $sizeOnDisk =>
double(83886080)
public $empty =>
bool(false)
}
Есть ли практический или простой способ действительно выбрать их или просто отбросить все одним методом?
метод бросить на самом деле на MongoClient
и конечно есть getName()
от MongoDB\Model\DatabaseInfo
типы, которые возвращаются из listDatabases()
public function tearDown()
{
$databases = $this->mongoClient->listDatabases();
foreach ($databases as $db) {
$this->mongoClient->dropDatabase($db->getName());
}
}
По-другому вы могли бы selectDatabase()
и использовать drop()
метод на MongoDB \ База данных:
public function tearDown()
{
$databases = $this->mongoClient->listDatabases();
foreach ($databases as $db) {
$this->mongoClient->selectDatabase($db->getName())->drop();
}
}
Но, на мой взгляд, это немного более кратко, и первая форма кажется более выразительной.
Поскольку «база данных» является базовым контейнером для пространства имен, тогда фактически нет команды «отбросить все». Список и цикл в списке, как вы это делаете. Суть в том, если это не в «справочник команд», тогда такого нет.
Других решений пока нет …