nie używam dwa oddzielne DB dla rozwoju i testowania
to pierwszą rzeczą do rozwiązania - ponieważ bez testów db, testy uruchomione wpłynie na db rozwoju i vice versa który jest okropny pomysł. Powinieneś być w stanie uruchomić testy w środowisku produkcyjnym z całkowitą pewnością, że nic, co zrobisz w teście, nie wpłynie na twoją wdrożoną stronę.
Konfiguracja połączenia Test
więc zmodyfikować parameters.yml mieć coś takiego:
database.host: localhost
database.port: 27017
database.db: myappname
database.test.host: localhost
database.test.port: 27017
database.test.db: myappname-test
Ponadto w app/config pliku/config_test.yml przesłonić domyślne połączenie tak, aby cokolwiek wyzwalać jako część testu, który żąda domyślnego menedżera dokumentów, otrzyma menedżera wskazującego na swój test db:
doctrine_mongodb:
document_managers:
default:
database: %database.test.db%
Przygotuj się do testów z osprzętem
Następnie, czego chcą skutecznie zrobić, to:
- obciąć odpowiednich zbiorów
- obciążenie oprawy
na db test przed każdym testem .
Oto przykład abstract class Test:
<?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);
}
}
użytkowania lamp w badaniach
Z poprzedniej klasy abstrakcyjnej testowym, można następnie napisać testy, które wykorzystują swoje dane osprzętu - czy nie - w razie potrzeby. Poniżej jest banalny przykład.
<?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.
}
Przed każdym badaniem mecze już zdefiniowane zostaną załadowane (obcinanie zbiory wpływają one), dając spójny stan db, na których można oprzeć swoje testy.
zapomniałem powiedzieć, że nie używam dwóch oddzielnych DB dla rozwoju i testowania, więc to normalne 'łza()', że wszystko spada nie jest rozwiązaniem dla mnie ... – mokagio