Eftersom Yii:s testningsramverk anvÀnder sig av PHPUnit, rekommenderas PHPUnit-dokumentationen för att ge en grundlÀggande förstÄelse för hur man skriver ett enhetstest. Vi sammanfattar följande grundlÀggande principer för hur man skriver ett enhetstest i Yii:
Ett enhetstest skrivs i form av en klass XyzTest som Àrver frÄn CTestCase
eller CDbTestCase och dÀr Xyz stÄr för klassen som skall testas. För att
till exempel testa klassen Postbehöver vi, enligt konvention, namnge det
motsvarande enhetstestet som PostTest. Basklassen CTestCase Àr tÀnkt att
anvÀndas för generella enhetstester, medan CDbTestCase passar för testning av
active record modellklasser. Eftersom PHPUnit_Framework_TestCase Àr
förÀlderklass till bÄda klasserna, kan vi anvÀnda alla metoder som Àrvs frÄn densamma.
Enhetstestklassen sparas i en PHP-fil namngiven som XyzTest.php. Enligt
konvention sparas enhetstestfilen under katalogen protected/tests/unit.
Testklassen bestÄr i huvudsak av en uppsÀttning testmetoder namngivna som
testAbc, dÀr Abc ofta Àr namnet pÄ klassen som skall testas.
En testmetod innehÄller vanligen en följd av assertion-satser (t.ex.
assertTrue, assertEquals) som tjÀnstgör som kontrollstationer vid validering
av mÄlklassens beteende.
I det följande beskrivs i huvudsak hur man skriver enhetstester för Active Record modellklasser. Vi kommer att Àrva vÄra testklasser frÄn CDbTestCase eftersom denna erbjuder stöd för databasfixturer (som introducerades i föregÄende avsnitt).
Antag att vi vill testa modellklassen Comment i applikationen blog demo.
Vi börjar med att skapa en klass och ger den namnet CommentTest samt sparar den som protected/tests/unit/CommentTest.php:
class CommentTest extends CDbTestCase
{
public $fixtures=array(
'posts'=>'Post',
'comments'=>'Comment',
);
......
}I denna klass specificerar vi medlemsvariabeln fixtures till att vara en array
som specificerar vilka fixturer som kommer anvÀndas av detta test. Arrayen representerar
en mappning mellan fixturnamn och modellklassnamn alternativt fixturtabellnamn (t.ex.
frÄn fixturnamnet posts till modellklassen Post). MÀrk att nÀr mappningen sker till
fixturtabellnamn sÀtter vi in ett kolon som prefix före tabellnamnet (t.ex. :Post)
för att sÀrskilja det frÄn modellklassnamn. Vid anvÀndning av modelklassnamn kommer
motsvarande tabeller att betraktas som fixturtabeller. Som tidigare beskrivits ÄterstÀlls
fixturtabeller till nÄgot kÀnt tillstÄnd varje gÄng en testmetod exekveras.
Fixturnamn ger tillgÄng till fixturdata frÄn testmetoder pÄ ett praktiskt sÀtt. Följande kod ger typiska anvÀndningsexempel:
// return all rows in the 'Comment' fixture table
$comments = $this->comments;
// return the row whose alias is 'sample1' in the `Post` fixture table
$post = $this->posts['sample1'];
// return the AR instance representing the 'sample1' fixture data row
$post = $this->posts('sample1');MĂ€rk: Om en fixtur har deklarerats med sitt tabellnamn (t.ex.
'posts'=>':Post'), Àr det tredje exemplet ovan inte giltigt eftersom vi inte har nÄgon information om
vilken modellklass tabellen Àr associerad till.
Nu skriver vi en metod testApprove för att testa metoden approve i modellklassen
Comment. Koden Àr okomplicerad: först sÀtter vi in en kommentar som ÄsÀtts status
Pending; dÀrefter verifierar vi, genom att hÀmta tillbaka kommentaren frÄn databasen, att
den erhÄllit status Pending; slutligen anropar vi metoden approve och verifierar att
status Àndras som förvÀntat.
public function testApprove()
{
// insert a comment in pending status
$comment=new Comment;
$comment->setAttributes(array(
'content'=>'comment 1',
'status'=>Comment::STATUS_PENDING,
'createTime'=>time(),
'author'=>'me',
'email'=>'me@example.com',
'postId'=>$this->posts['sample1']['id'],
),false);
$this->assertTrue($comment->save(false));
// verify the comment is in pending status
$comment=Comment::model()->findByPk($comment->id);
$this->assertTrue($comment instanceof Comment);
$this->assertEquals(Comment::STATUS_PENDING,$comment->status);
// call approve() and verify the comment is in approved status
$comment->approve();
$this->assertEquals(Comment::STATUS_APPROVED,$comment->status);
$comment=Comment::model()->findByPk($comment->id);
$this->assertEquals(Comment::STATUS_APPROVED,$comment->status);
}
Found a typo, or you think this page needs improvement?
Edit it on GitHub !
Signup or Login in order to comment.