SimpleTest alaycı Sorunu

2 Cevap php

Bazı test durumları yazıyorum, ve ben Mock nesneleri kullanarak bir test case var. Ben iki sınıf yöntemleri başka bir sınıf yöntemi denir olmadığını kontrol etmek gerekir. Burada yaptığım buydu:

Önce Mock oluşturulan:

Mock::generate('Parser');

Sonra, benim test içindeki aradım:

$P = new MockParser();

$P->expectOnce('loadUrl', array('http://url'));
$P->expectOnce('parse');

$P->fetchAndParse('http://url');

Benim uygulama kodu gibi görünüyor:

public function fetchAndParse($url) {
	$this->loadUrl($url);
	$this->parse();
}

Ve loadURL ve ayrıştırma () yöntemleri kesinlikle var. Benim testlerde iki arızaları alıyorum, hem de "[1] var [0] [loadURL] için Beklenen arama sayısı olan" bana. Ben ne oluyor hiçbir fikrim var - yöntemleri o fonksiyonu denir ediliyor!

Teşekkürler,

Jamie

2 Cevap

Benim deneyim. NET dünyada çerçeveler alaycı olsa da, ben ne yapmaya çalışıyoruz yanlış olduğunu düşünüyorum.

Bir sınıf için bir mock oluşturmak istedi herhangi alaycı bir çerçeve, bu sınıfta TÜM yöntemleri için "taslakları" üretir. Bu yöntem fetchAndParse içerir. Eğer alay nesne $ P fetchAndParse ararken Yani, yöntemleri loadURL ve ayrıştırma denir DEĞİLDİR. Gerçekten ne yapıyorsun "söndürdü" fetchAndParse yöntemini çağırıyor.

Gerçekten PHP deneyimli değilim, ben senin testi denemek ve düzeltmek istemiyorum. Umarım başkası yapabilir.

Sen işleri alaycı nasıl yanlış. Eğer sınıfta bir yardımcı nesnesi ayarlamak için bağımlılık enjeksiyon kullanıyorsanız, o zaman enjekte nesneyi taklit edebilir. Bundan sonra orijinal nesnenin davranışını (arayüz) benzetilebilir. Iyi bir yol mevcut arabirimini uygulayan herhangi bir sınıfı yaratmadan gelişebilir çünkü arayüzleri alay etmektir.

Lütfen örnek:

interface UrlLoaderInterface {

    public function load($url);
}

class YourParser {

    protected $urlLoader;
    protected $source;

    public function setUrlLoader(UrlLoaderInterface $urlLoader) {
        $this->urlLoader = $urlLoader;
    }

    public function fetchAndParse($url) {
        $this->loadUrl($url);
        $this->parse();
    }

    public function loadUrl($url) {
        $this->source = $this->urlLoader->load($url);
    }

    public function parse() {

    }

}

Mock::generate('UrlLoaderInterface', 'MockUrlLoader');

class TestYourParser extends UnitTestCase {

    public function testShouldCallUrlLoaderByFetchAndParse() {
        $testUrl = 'http://url';

        $urlLoader = new MockUrlLoader();
        $urlLoader->expectOnce('load', array($testUrl));
        $urlLoader->returns('load', 'source', array($testUrl));

        $parser = new YourParser();
        $parser->setUrlLoader($urlLoader);
        $parser->fetchAndParse($testUrl);
    }

}

Btw. sizin örnek bir yöntem adları gibi 've' kelime 'veya' içeremez, çünkü başarısız vb, 'eğer' .. Bir yöntem sadece tek bir şey yapmak için izin verilir. Eğer bu kelimeleri kullanmak, o zaman kötü bir dizayn koduna sahip olduğundan emin olabilirsiniz.