0 follower

Enhetstestning

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 !