我不是用於開發兩個單獨的DB和測試
這是解決的第一件事
- 因爲沒有一個測試分貝,運行測試會影響你的發展分貝反之亦然這是一個可怕的想法。您應該能夠在生產環境中運行測試,絕對相信您在測試中做的任何事情都不會影響您部署的站點。
安裝測試連接
因此,修改parameters.yml有這樣的事情:
database.host: localhost
database.port: 27017
database.db: myappname
database.test.host: localhost
database.test.port: 27017
database.test.db: myappname-test
此外,在您的應用程序/配置/ config_test.yml文件覆蓋默認連接,以便您作爲測試的一部分觸發任何請求默認文檔管理器的內容,將會收到一個指向您的測試分區的管理器:
doctrine_mongodb:
document_managers:
default:
database: %database.test.db%
與燈具
然後,你要有效地做準備測試是:
- 截斷相關藏品
- 負載燈具在每個測試之前,你的測試數據庫
。
下面是一個例子抽象測試類:
<?php
use Doctrine\Common\DataFixtures\Executor\MongoDBExecutor as Executor,
Doctrine\Common\DataFixtures\Purger\MongoDBPurger as Purger,
Doctrine\Common\DataFixtures\Loader,
Doctrine\Common\DataFixtures\ReferenceRepository,
Symfony\Bundle\FrameworkBundle\Test\WebTestCase,
Symfony\Bundle\FrameworkBundle\Console\Application;
abstract class AbstractTest extends WebTestCase
{
/**
* Array of fixtures to load.
*/
protected $fixtures = array();
/**
* Setup test environment
*/
public function setUp()
{
$kernel = static::createKernel(array('environment' => 'test', 'debug' => false));
$kernel->boot();
$this->container = $kernel->getContainer();
$this->dm = $this->container->get('doctrine.odm.mongodb.document_manager');
if ($this->fixtures) {
$this->loadFixtures($this->fixtures, false);
}
}
/**
* Load fixtures
*
* @param array $fixtures names of _fixtures to load
* @param boolean $append append data, or replace?
*/
protected function loadFixtures($fixtures = array(), $append = true)
{
$defaultFixtures = false;
$loader = new Loader();
$refRepo = new ReferenceRepository($this->dm);
foreach ((array) $fixtures as $name) {
$fixture = new $name();
$fixture->setReferenceRepository($refRepo);
$loader->addFixture($fixture);
}
$purger = new Purger();
$executor = new Executor($this->dm, $purger);
$executor->execute($loader->getFixtures(), $append);
}
}
使用固定裝置在你的測試
與以往的抽象測試類,然後你可以寫一個使用固定數據進行測試 - 或不 - 作爲適當的。下面是一個簡單的例子。
<?php
use Your\AbstractTest,
Your\Document\Foo;
class RandomTest extends AbstractTest
{
/**
* fixtures to load before each test
*/
protected $fixtures = array(
'APP\FooBundle\DataFixtures\MongoDB\TestFoos',
'APP\FooBundle\DataFixtures\MongoDB\TestBars'
);
...
/**
* Check it gets an ID (insert succeeded)
*
*/
public function testCreateDefaults()
{
$foo = new Foo();
$this->dm->persist($foo);
$this->dm->flush();
$this->assertNotNull($foo->getId());
$this->assertSame('default value', $foo->getSomeProperty());
// etc.
}
/**
* Check result of something with a given input
*
*/
public function testSomething()
{
$foo = $this->dm->getRepository(APPFooBundle:Foo)->findByName('Some fixture object');
$foo->doSomething();
$this->assertSame('modified value', $foo->getSomeProperty());
// etc.
}
每次測試之前,您已經定義了燈具將被加載(截斷他們影響的集合),從而在其基礎上的測試一致的數據庫狀態。
我忘了說,我沒有使用兩個單獨的數據塊進行開發和測試,因此普通的'拆解()'那滴一切不是我一個解決方案... – mokagio 2012-04-04 14:07:32