SimpleTest Mock nesneler: takas beklentileri

1 Cevap php

The short question: Is there a way to reset a Mock object in SimpleTest, removing all expectations?

The longer explanation:

Ben SimpleTest kullanarak test ediyorum bir sınıf var ve bunu kullanarak Mock nesneler ile bazı sorun yaşıyorum.

Sınıf Logger, ve logger iç Writer nesneler (FileWriter, EmailWriter, vb) bir dizi vardır. Logger::log() yöntemini çağırarak sahneleri ve doğru yazar yollarının mesajı arkasında bazı mantık gerçekleştirir. Yazarlar yeniden başlatmasını her bir her zaman kazanmak için Logger sınıfta önbelleğe alınır.

Benim birim testlerde, ben, bir Logger kurmak oluşturmak ve bazı Mock Yazar nesneler eklemek ve ardından MockDBWriter->expectOnce() Logger çalıştığını test etmek gibi yöntemler kullanıyoruz.

Sorun şimdi Logger'un başka işlevini test etmek istediğiniz olduğunu, ancak expectOnce beklentilerinin halen yürürlükte olan ve benim sonraki testleri başarısız olmasına neden.

function testWritesMessageOK() {
    $log = Logger::getInstance();
    $mock = new MockFileWriter($this);

    $log->addWriter($mock);

    $mock->expectOnce("write", "Message");

    $log->write("Message");    // OK
}

// this is just an example - the actual test is much less inane
function testNumberOfWrites() {
    $log = Logger::getInstance();
    $mock = $log->getWriter();

    $mock->expectCallCount('write', 2);

    $log->write("One");    // fail - it doesn't match "Message"
    $log->write("Two");
}

Tüm beklentileri kaldırarak, bir Mock nesne sıfırlamak için bir yolu var mı?

1 Cevap

Use separate mock instances.

Ya:

$mock = $log->getWriter();
$mock = new $mock;

Veya:

$mock = new MockFileWriter($this);
// And then:
$mock = new MockDBWriter($this);
// And then:
$mock = new MockEmailWriter($this);
// etc.

Ben yeniden örnekleme kaydetmek için önbelleğe alma yazarların bilgeliği soru. Eğer ucuz bir operasyon instantiation yaparsanız (yani DB bağlantısı ya da bir şey yaratmak değil) ve aslında bu tür ilk sorgu olarak bağlantıyı, ihtiyacınız kadar bu tür bir şey erteleme, o zaman önbelleğe gerek kalmayacak ve bütün bu sorun olabilir go away.

Yapabileceğiniz başka bir şey SimpleMock kurucu aramak.

$mock = $log->getWriter();
$mock->SimpleMock();

Tüm bu yapacağım Hangi:

/**
 *    Creates an empty action list and expectation list.
 *    All call counts are set to zero.
 *    @access public
 */
function SimpleMock() {
    $this->_actions = &new SimpleCallSchedule();
    $this->_expectations = &new SimpleCallSchedule();
    $this->_call_counts = array();
    $this->_expected_counts = array();
    $this->_max_counts = array();
    $this->_expected_args = array();
    $this->_expected_args_at = array();
    $test = &$this->_getCurrentTestCase();
    $test->tell($this);
}

Bunda tek sorun tell() neden olacak sonunda diyoruz ki beklentilerini Sayım zaman SimpleMock::atTestEnd() iki defa çağrılacak. Ancak, bu ile düzeltmek olabilir:

// $this should == the test case in question
array_pop($this->_observers);

Bu cevap SimpleTest sürümü 1.0.1 dayanmaktadır.