2012-06-22 24 views
5

Có thể tôi đang làm điều này sai.cách tạo mô hình trong trường hợp thử nghiệm mô hình

Tôi muốn thử nghiệm phương pháp beforeSave của mô hình (Kháng thể). Một phần của phương thức này gọi một phương thức trên một mô hình liên quan (các loài). Tôi muốn thử mô hình loài nhưng không tìm ra cách.

Có thể hoặc tôi đang làm điều gì đó chống lại mẫu MVC và do đó cố gắng làm điều gì đó mà tôi không nên?

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

Trả lời

5

Giả sử mô hình loài của bạn được tạo bởi bánh do quan hệ, bạn có thể si mply làm một cái gì đó như thế này:

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

cảm ơn bạn, đó chỉ là những gì tôi đang tìm kiếm – kaklon

0

Vâng, nó phụ thuộc vào cách thức đối tượng 'Loài' của bạn được tiêm. Nó có được tiêm thông qua hàm tạo không? Thông qua một setter? Nó có được kế thừa không?

Dưới đây là một ví dụ với một constructor tiêm đối tượng:

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

Sau đó, kiểm tra của bạn sẽ là một cái gì đó như thế này:

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

Quá trình này là hoàn toàn giống với setter tiêm các đối tượng:

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()); 
} 
Các vấn đề liên quan