2015-03-19 12 views
5

मैं एक मॉडल के लिए परीक्षण लिख रहा हूं जो एक घटना को चलाता है जब इसकी एक संपत्ति बदल जाती है। दुर्भाग्य से, मैं इसका परीक्षण करने का सबसे अच्छा तरीका नहीं समझ सकता। मॉडल कोड है:मैं लैरवेल घटनाओं का सही तरीके से परीक्षण कैसे करूं?

class Foo extends Eloquent { 
    public function setNameAttribute($value) { 
     $this->attributes['name'] = $value; 
     if($this->exists && ($this->original['name'] != $value)) { 
      Event::fire('foo.NameChange', array($this)); 
     } 
    } 
} 

घटना आग के लिए मेरे प्रारंभिक परीक्षण:

$bar = Foo::first(); 
Event::shouldReceive('fire')->once()->with('foo.NameChange', array($bar)); 
$bar->name = 'test'; 

समस्या, ऊपर परीक्षण अभी भी पारित किया गया है, तो:

  • किसी भी स्थिति सभी
  • पर हुई
  • मैं मॉडल के नाम को दूसरी बार बदल रहा हूं (जो, दूसरी बार घटना के लिए आग लगाना चाहिए, है ना?)

यदि मैं foo.NameChange ईवेंट हुआ तो मैं अपने परीक्षण केवल तभी पास कर सकता हूं? अन्य सभी सेनारियो को मेरी परीक्षा में असफल होना चाहिए।

+0

यदि कोई घटना नहीं हुई है तो आपका परीक्षण विफल होना चाहिए - जैसा कि आपने इसे मजाक किया है और कहा है कि इसे 'एक बार' निकाल दिया जाना चाहिए? – Laurence

+0

क्या आपने 'मॉकरी :: क्लोज़() '? को कॉल किया था, [पुराने एसओ सवाल] पर भी मेरी व्याख्या देखें (http://stackoverflow.com/questions/16035549/mockery-shouldreceive-once-doesnt-seem-to- काम/16308814 # 16308814) –

+0

बहुत धन्यवाद @BramGerritsen! 'मॉकरी :: क्लोज़()' कथन के साथ परीक्षण बंद करने से इसे ठीक किया गया! क्या आप अपनी टिप्पणी को उत्तर में बदलने के लिए बहुत दयालु हो सकते हैं? इसके अलावा मुझे आश्चर्य है कि इसका आधिकारिक दस्तावेज [लैरावेल] (http://laravel.com/docs/4.2/testing#mocking-facades) में क्यों नहीं बताया गया है। – nstapelbroek

उत्तर

2

आपको tearDown() विधि में Mockery::close() पर कॉल करना होगा। PHPUnit एकीकरण पर Mockery docs देखें।

संबंधित मुद्दे

 संबंधित मुद्दे