2013-06-25 26 views
5

Tôi bắt đầu làm việc với Silex và nó rất tuyệt. Vấn đề xuất hiện khi cố gắng kiểm tra các lớp của tôi đúng cách. Cụ thể là đóng cửa: ( Trong các dòng sau đây tôi giải thích vấn đề của mình để xem liệu có ai trong số các bạn biết cách giải quyết nó không.) Xin vui lòng, không tập trung vào cú pháp mà là tập trung vào vấn đề thử nghiệm. này:Thử nghiệm trong Silex (đóng cửa mô hình) bằng cách sử dụng PHPUnit

<?php 

namespace Foo\Provider; 

use Silex\Application; 
use Silex\ServiceProviderInterface; 

use Foo\Bar; 

class BarProvider implements ServiceProviderInterface { 

    public function register(Application $app) { 
     $app[ 'foo_bar' ] = $app->protect(function() use ($app) { 
      return new Bar($app); 
     }); 
    } 

    public function boot(Application $app) {} 
} 

Sau đó, tôi cần phải nhận được một thể hiện của các yếu tố foo_bar:.

<?php 

namespace Foo; 

use Silex\Application; 

class Clazz { 
    protected $bar; 

    public function __construct(Application $app) { 
     $this->bar = $app[ 'foo_bar' ](); 
    } 
} 

này chỉ hoạt động tốt Cái này là tôi đang phát triển sử dụng TDD (và PHPUnit) và tôi không thể kiểm tra thích hợp lớp Clazz.

<?php 

namespace Foo\Test; 

use PHPUnit_Framework_TestCase; 

use Silex\Application; 

use Foo\Bar; 
use Foo\Clazz; 

class ClazzTest extends PHPUnit_Framework_TestCase { 

    public function testConstruct() { 
     $mock_bar = $this->getMock('Foo\Bar'); 

     $mock_app = $this->getMock('Silex\Application'); 
     $mock_app 
      ->expects($this->once()) 
      ->method('offsetGet') 
      ->with('foo_bar') 
      ->will($this->returnValue($mock_bar)); 

     new Class($mock_app); 
    } 
} 

Sự cố ở đây nằm trong "()" sau $ app ['foo_bar'] trong lớp Clazz. Khi cố thực hiện kiểm tra, tôi nhận được lỗi "Lỗi nghiêm trọng về PHP: Tên hàm phải là một chuỗi trong ...". Tôi hiểu rằng tôi không thể đơn vị kiểm tra lớp theo cách này nhưng tôi không thấy cách thích hợp để làm điều đó.

Làm cách nào tôi có thể kiểm tra câu lệnh này (vì ở cuối câu lệnh phức tạp duy nhất là $ this-> bar = $ app 'foo_bar';)?

+0

Có lẽ github sẽ cung cấp cho bạn một số nguồn cảm hứng: https://github.com/fabpot/Silex/tree/master/tests/Silex/Tests – qrazi

+0

Tôi đã thử điều đó nhưng không thể tìm thấy một ví dụ hay: ( – ThisIsErico

Trả lời

3

Ok, tôi nghĩ rằng tôi đã kiểm soát đúng cách đóng cửa này! Bài kiểm tra cuối cùng trông giống như sau:

<?php 

namespace Foo\Test; 

use PHPUnit_Framework_TestCase; 

use Silex\Application; 

use Foo\Bar; 
use Foo\Clazz; 

class ClazzTest extends PHPUnit_Framework_TestCase { 

    public function testConstruct() { 
     $mock_bar = $this->getMock('Foo\Bar'); 

     $mock_app = $this->getMock('Silex\Application'); 
     $mock_app 
      ->expects($this->once()) 
      ->method('offsetGet') 
      ->with('foo_bar') 
      ->will($this->returnValue(function() use($mock_bar) { return $mock_bar; })); 

     new Class($mock_app); 
    } 
} 

Thay vì trả lại mô hình, tôi trả lại bản đóng trả lại mẫu. Bằng cách này tôi không nhận được lỗi trong khi vẫn làm việc với các mô hình thực tế.

Bất cứ ai có thể cho tôi biết đây có phải là cách tiếp cận chính xác không?

Các vấn đề liên quan