我试图对我的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()只返回我的dbs的一些信息模型,而不是实际的数据库本身:
/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)
}
是否有任何实用或简单的方法可以真正选择它们,或者只使用一种方法删除所有内容?
答案 0 :(得分:1)
method to drop实际上位于MongoClient
,当然getName()
MongoDB\Model\DatabaseInfo
类型中有listDatabases()
public function tearDown()
{
$databases = $this->mongoClient->listDatabases();
foreach ($databases as $db) {
$this->mongoClient->dropDatabase($db->getName());
}
}
或者你可以selectDatabase()
并在MongoDB \ Database上使用drop()
方法:
public function tearDown()
{
$databases = $this->mongoClient->listDatabases();
foreach ($databases as $db) {
$this->mongoClient->selectDatabase($db->getName())->drop();
}
}
但在我看来,这更简洁,第一种形式更具表现力。
由于“数据库”是命名空间的基本容器,因此实际上没有“放弃所有内容”的命令。清单和循环列表就是你如何做到的。底线是,如果它不在"command reference",那么就没有这样的东西了。