Np. metoda podana pod http://bakery.cakephp.org/articles/view/testing-models-with-cakephp-1-2-test-suite dla testu modelu się nie sprawdza. Okazuje się, że tam jest podany stary model tworzenia testów. Poprawna klasa powinna wyglądać mniej więcej tak:
zamiast podanej:
<?php
App::import('model', 'Article');
class ArticleTestCase extends CakeTestCase {
var $fixtures = array( 'app.article' );
function start() {
parent::start();
$this->Article= & ClassRegistry::init('article');
}
function testPublished() {
$result = $this->Article->published(array('id', 'title'));
$expected = array(
array('Article' => array( 'id' => 1, 'title' => 'First Article' )),
array('Article' => array( 'id' => 2, 'title' => 'Second Article' )),
array('Article' => array( 'id' => 3, 'title' => 'Third Article' ))
);
$this->assertEqual($result, $expected);
}
}
?>
Drugi przypadek generuje następujące problemy:
<?php
loadModel('Article');
class ArticleTest extends Article {
var $name = 'ArticleTest';
var $useDbConfig = 'test_suite';
}
class ArticleTestCase extends CakeTestCase {
var $fixtures = array( 'article_test' );
function testPublished() {
$this->ArticleTest =& new ArticleTest();
$result = $this->ArticleTest->published(array('id', 'title'));
$expected = array(
array('ArticleTest' => array( 'id' => 1, 'title' => 'First Article' )),
array('ArticleTest' => array( 'id' => 2, 'title' => 'Second Article' )),
array('ArticleTest' => array( 'id' => 3, 'title' => 'Third Article' ))
);
$this->assertEqual($result, $expected);
}
}
?>
- Gdy testy masz ustawione tak, żeby korzystały z tej samej bazy, gdzie masz "normalne" tabele, to testy na zmianę będą wykonywać się poprawnie i zgłaszać błąd z nieistniejącą tabelą (`articles_test`)
- Gdy masz osobną baze do testów - będą się sypać relacje. Pewnie zdefiniowanie wszystkich fixtures powiązanych z testowanym modelem rozwiązało by problem, ale nie sprawdzałem.
Prawdopodobnie będziesz dostawał Segmentation Fault po kliknięciu "Analyze Code Coverage". Jeśli tak, odnajdź poniższą linię w pliku cake/test/lib/code_coverage_manager.php:
xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE);
Niestety Xdebug sypie się przy takim wykonaniu xdebug_start_code_coverage. Możesz zmienić tą linię na
xdebug_start_code_coverage(XDEBUG_CC_UNUSED)
lub
xdebug_start_code_coverage(XDEBUG_CC_DEAD_CODE)
O rożnicy możesz poczytać w dokumentacji Xdebug.
Ostatnia sprawa to pokrycie kodu, gdy wykonujesz test całej grupy. Jeśli chcesz dostawać informacje o pokryciu dla poszczególnych testów, nie używaj TestManager::loadTestCasesFromFile, ale raczej ładuj każdy plik osobno za pomocą TestManager::addTestFile.
To na razie tyle. Miłego testowania ;)
opisać problem z coverage, jeśli grupa jest zdefiniowana jako loadTestCasesFromFile
Brak komentarzy:
Prześlij komentarz