2014-12-16 14 views
16

Tôi cần thực hiện một số kiểm tra chức năng trực tiếp trong một gói độc lập. Tôi không muốn thử nghiệm một bộ điều khiển, chỉ cần một số tương tác giữa các dịch vụ thực.Kiểm tra chức năng bên trong gói Symfony2 độc lập

Tôi muốn biết liệu có cách nào tốt nhất để làm điều đó hay không. Tôi đã làm nó một cách nhưng muốn biết nếu có một tốt hơn.

+0

thể trùng lặp của (http [Làm thế nào tôi có thể kiểm tra một dịch vụ trong symfony2?]: // stackoverflow. com/questions/17798143/how-can-i-test-a-service-in-symfony2) –

+0

Không, tôi không muốn thực hiện các kiểm tra của gói trong ứng dụng. – Gnucki

+0

Tôi đã đưa ra giải pháp của riêng mình trong một câu trả lời. Đó là một chút dài đó là một trong những lý do tôi đã không đặt nó trong câu hỏi của tôi. – Gnucki

Trả lời

32

Đây là giải pháp của riêng tôi (tôi tóm tắt tất cả các quá trình để thử nghiệm trong một gói độc lập):

1. Đầu tiên, một bó tốt có riêng của mình composer.json để xác định sự phụ thuộc của nó:

{ 
    "name": "my/own-bundle", 
    "type": "symfony-bundle", 
    "description": "Symfony2 bundle that provides ...", 
    "keywords": ["my","own"], 
    "license": "MIT", 
    "authors": [ 
     { 
      "name": "John Doe", 
      "email": "[email protected]" 
     } 
    ], 
    "require": { 
     "php": ">=5.3.2", 
     "symfony/framework-bundle": ">=2.3" 
    }, 
    "require-dev": { 
     "phpunit/phpunit": "3.7.*" 
    }, 
    "autoload": { 
     "psr-0": { "My\\OwnBundle": "" } 
    }, 
    "target-dir": "My/OwnBundle", 
    "minimum-stability": "dev" 
} 

Lưu ý việc sử dụng phụ thuộc vào symfony/framework-bundle cần thiết cho các thử nghiệm về dịch vụ của chúng tôi. Bạn chắc chắn có thể giảm bớt các phụ thuộc trong việc xác định các phụ thuộc thực sự của riêng bạn trên lõi của symfony.

Với tập tin này, tôi có thể xử lý các lệnh (làm điều đó) để xây dựng thư mục nhà cung cấp của gói của tôi:

$ composer update 

2. Sau đó, tôi đặt phpunit tập tin cấu hình của tôi:

<!-- phpunit.xml.dist --> 

<?xml version="1.0" encoding="UTF-8"?> 

<phpunit backupGlobals="false" 
     backupStaticAttributes="false" 
     colors="true" 
     convertErrorsToExceptions="true" 
     convertNoticesToExceptions="true" 
     convertWarningsToExceptions="true" 
     processIsolation="false" 
     stopOnFailure="false" 
     syntaxCheck="false" 
     bootstrap="Tests/bootstrap.php" 
> 
    <testsuites> 
     <testsuite name="MyOwnBundle Test Suite"> 
      <directory>./Tests/</directory> 
     </testsuite> 
    </testsuites> 

    <filter> 
     <whitelist> 
      <directory>./</directory> 
      <exclude> 
       <directory>./Resources</directory> 
       <directory>./Tests</directory> 
       <directory>./vendor</directory> 
      </exclude> 
     </whitelist> 
    </filter> 
</phpunit> 

3. Sau đó, tôi đặt bootstrap php cho tự động tải của lớp trong thư mục kiểm tra của tôi:

// Tests/bootstrap.php 

$file = __DIR__.'/../vendor/autoload.php'; 
if (!file_exists($file)) 
{ 
    $file = __DIR__.'/../../../../../../vendor/autoload.php'; 
    if (!file_exists($file)) 
     throw new RuntimeException('Install dependencies to run test suite.'); 
} 

$autoload = require_once $file; 

Các bước này là tiêu chuẩn cho bất kỳ thử nghiệm nào trong một gói độc lập.

4. Bây giờ, tôi muốn để mô phỏng một ứng dụng để làm một số xét nghiệm functionnal về các dịch vụ của tôi:

Tôi cần một lớp hạt nhân:

// Tests/AppKernel.php (you can define it in a subdirectory /Fixtures if you prefer) 

use Symfony\Component\HttpKernel\Kernel; 
use Symfony\Component\Config\Loader\LoaderInterface; 

class AppKernel extends Kernel 
{ 
    public function registerBundles() 
    { 
     $bundles = array(); 

     if (in_array($this->getEnvironment(), array('test'))) { 
      $bundles[] = new Symfony\Bundle\FrameworkBundle\FrameworkBundle(); 
      $bundles[] = new My\OwnBundle\MyOwnBundle(); 
     } 

     return $bundles; 
    } 

    public function registerContainerConfiguration(LoaderInterface $loader) 
    { 
     $loader->load(__DIR__.'/config.yml'); 
    } 
} 

Và tương ứng config.yml:

# Tests/config.yml 

framework: 
    secret: test 
    session: 
     storage_id: session.storage.mock_file 

my_own: 
    test: 2 

Dưới đây là ví dụ với mô hình cho phiên. Đừng quên chỉ định các nút cấu hình khung chính xác nếu bạn muốn có quyền truy cập vào một số dịch vụ (nếu bạn không chỉ định nút session, bạn không có dịch vụ session chẳng hạn).

5. Cuối cùng, tôi có thể lấy dịch vụ của tôi như sau trong các lớp học thử nghiệm của tôi:

// Tests/Functional/Handling/Handler.php 

namespace My\OwnBundle\Tests\Functional\Handling; 

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; 

class HandlerTest extends WebTestCase 
{ 
    private $handler; 

    protected function setUp() 
    { 
     require_once __DIR__.'/../../AppKernel.php'; 

     $kernel = new \AppKernel('test', true); 
     $kernel->boot(); 
     $container = $kernel->getContainer(); 
     $this->handler = $container->get('my_own.handling.handler'); 
    } 

    public function testHandle() 
    { 
     $this->assert($this->handler->handle()); 
    } 
} 
Các vấn đề liên quan