2012-06-22 4 views
5

Może robię to źle.jak stworzyć próbę w modelu przypadku testowego

Chciałbym przetestować metodę beforeSave modelu (Antibody). Część tej metody wywołuje metodę na skojarzonym modelu (gatunki). Chciałbym wyśmiać model gatunku, ale nie wiem jak.

Czy to możliwe lub czy robię coś, co jest sprzeczne ze wzorcem MVC, a tym samym próbuje zrobić coś, czego nie powinienem robić?

class Antibody extends AppModel { 
    public function beforeSave() { 

     // some processing ... 

     // retreive species_id based on the input 
     $this->data['Antibody']['species_id'] 
      = isset($this->data['Species']['name']) 
      ? $this->Species->getIdByName($this->data['Species']['name']) 
      : null; 

     return true; 
    } 
} 

Odpowiedz

5

Zakładając, że Twój model Gatunek stworzony przez ciasto ze względu na relacje, możesz mply zrób coś takiego:

public function setUp() 
{ 
    parent::setUp(); 

    $this->Antibody = ClassRegistry::init('Antibody'); 
    $this->Antibody->Species = $this->getMock('Species'); 

    // now you can set your expectations here 
    $this->Antibody->Species->expects($this->any()) 
     ->method('getIdByName') 
     ->will($this->returnValue(/*your value here*/)); 
} 

public function testBeforeFilter() 
{ 
    // or here 
    $this->Antibody->Species->expects($this->once()) 
     ->method('getIdByName') 
     ->will($this->returnValue(/*your value here*/)); 
} 
+0

dziękuję, właśnie tego szukałem – kaklon

0

Cóż, zależy to od sposobu wstrzyknięcia obiektu "Gatunek". Czy jest wstrzykiwany za pośrednictwem konstruktora? Przez setera? Czy jest on dziedziczony?

Oto przykład z konstruktora wtryskiwanego obiektu:

class Foo 
{ 
    /** @var Bar */ 
    protected $bar; 

    public function __construct($bar) 
    { 
     $this->bar = $bar; 
    } 

    public function foo() { 

     if ($this->bar->isOk()) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
} 

Wtedy twój badanie byłoby coś takiego:

public function test_foo() 
{ 
    $barStub = $this->getMock('Overblog\CommonBundle\TestUtils\Bar'); 
    $barStub->expects($this->once()) 
     ->method('isOk') 
     ->will($this->returnValue(false)); 

    $foo = new Foo($barStub); 
    $this->assertFalse($foo->foo()); 
} 

Proces jest całkiem to samo z setter wstrzyknięto obiektów:

public function test_foo() 
{ 
    $barStub = $this->getMock('Overblog\CommonBundle\TestUtils\Bar'); 
    $barStub->expects($this->once()) 
     ->method('isOk') 
     ->will($this->returnValue(false)); 

    $foo = new Foo(); 
    $foo->setBar($barStub); 
    $this->assertFalse($foo->foo()); 
}