2012-06-22 2 views
5

Возможно, я делаю это неправильно.Как создать макет в тестовом примере модели

Я хотел бы протестировать метод beforeSave модели (Антитело). Часть этого метода вызывает метод для связанной модели (Виды). Я хотел бы высмеять модель Species, но не знаю, как это сделать.

Возможно ли это или я делаю что-то, что противоречит шаблону MVC и, таким образом, пытается сделать то, что я не должен делать?

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; 
    } 
} 

ответ

5

Предполагая, что ваша модель вида создана в результате тортов из-за отношений, вы можете si просто сделайте примерно так:

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

спасибо, это было именно то, что я искал – kaklon

0

Ну, это зависит от того, как вводится ваш объект «Вид». Вводится ли он через конструктор? Через сеттер? Наследуется ли она?

Вот пример с конструктором закачиваемого объектом:

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; 
     } 
    } 
} 

Тогда ваш тест будет что-то вроде этого:

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()); 
} 

Процесс достаточно же с инкубационными инжектированными объектами:

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()); 
}