2012-10-23 31 views
7

Tôi có một dịch vụ Symfony2 được xây dựng bằng cách sử dụng tham số từ config.yml bằng cách sử dụng tiêm phụ thuộc. Tôi hiện đang cố gắng để đơn vị kiểm tra nó và thấy rằng kiểm tra đơn vị không có quyền truy cập vào container và do đó dịch vụ. Vì vậy, tôi nên xây dựng một bản thân mình bằng cách sử dụng dữ liệu giả. Nó sẽ có ý nghĩa với tôi nếu bây giờ tôi có thể đọc các tham số cấu hình (đi đầu tiên để config_test.yml sau đó config.yml vv vv) nhưng nó xuất hiện mà không phải là có thể hoặc. Điều này xuất hiện để làm cho đơn vị thử nghiệm một dịch vụ cồng kềnh vì tôi sẽ cần phải mã các tham số khởi tạo vào thử nghiệm thay vì các tập tin cấu hình.Symfony2 lấy cấu hình params trong bài kiểm tra đơn vị

Nếu thực sự không có cách nào để xây dựng một dịch vụ với các tham số từ config.yml trong khi kiểm tra đơn vị, có ai biết logic là tại sao nó là Bad Thing ™ không?

Trả lời

5

Tôi tìm thấy bài đăng này, vì tôi cần tự mình định cấu hình các thông số trong các bài kiểm tra của mình. Đây là lần truy cập đầu tiên trên Google.

Tuy nhiên, đây là giải pháp hoạt động. Có thể có những cái tốt hơn.

<?php 

... 

require_once(__DIR__ . "/../../../../../app/AppKernel.php"); 

class MediaImageTest extends WebTestCase 
{ 
    private $_application; 
    private $storagePath; 

    public function setUp() { 
     $kernel = new \AppKernel('test', true); 
     $kernel->boot(); 
     $this->_application = new \Symfony\Bundle\FrameworkBundle\Console\Application($kernel); 
     $this->_application->setAutoExit(false) 

     $this->storagePath = $this->_application->getKernel()->getContainer()->getParameter('media_path'); 
    } 

    ... 
} 

Bạn có thể tìm trong này quá: Access Symfony 2 container via Unit test? Là một giải pháp sạch hơn nhiều truy cập vào hạt nhân trong vòng kiểm tra đơn vị.

+3

$ container-> getParameter() là câu trả lời –

2

Kiểm tra đơn vị là về việc thử nghiệm một lớp riêng biệt với các lớp khác. Để kiểm tra đơn vị dịch vụ của bạn, bạn không cần phải đọc bất cứ điều gì từ cấu hình. Chỉ cần vượt qua một giá trị trong bài kiểm tra của bạn. Cuối cùng, nó có khả năng có thể làm việc với các giá trị khác, phải không?

Tất nhiên nếu có một số logic/xác nhận xung quanh các giá trị được chấp nhận, bạn có lẽ nên bao gồm nó bằng các thử nghiệm. Hãy suy nghĩ xem bạn sẽ làm như thế nào nếu bạn lấy giá trị này từ cấu hình. Bạn chỉ đơn giản là sẽ không thể kiểm tra hành vi với các giá trị khác nhau.

Nếu bạn muốn xác minh xem ứng dụng của bạn có hoạt động chính xác không (các lớp của bạn cộng tác theo cách bạn mong đợi), hãy sử dụng các kiểm tra chức năng hoặc công cụ kiểm tra chấp nhận (như Behat).

+0

dịch vụ của tôi cần phải lấy dữ liệu từ máy chủ thử nghiệm của chúng tôi (chúng tôi có các máy chủ trong chế độ sản xuất và thử nghiệm). Những gì tôi đang thử nghiệm ở đây là cách dịch vụ phản ứng với dữ liệu mà nó nhận được từ đó. nó không hoàn toàn cô lập thử nghiệm đơn vị, nhưng tôi đã xác minh rằng dữ liệu sắp ra khỏi máy chủ là chính xác và thay vì sao chép và lưu đầu ra của máy chủ và nạp nó vào dịch vụ của tôi theo cách thủ công, tôi muốn xác minh rằng dịch vụ có thể nhận được dữ liệu. – Craig

+1

Vì vậy, nó không phải là đơn vị thử nghiệm ở tất cả. Thêm tích hợp hoặc kiểm tra hệ thống. Điều đơn giản nhất bạn có thể làm là sử dụng các bài kiểm tra chức năng của Symfony (đó vẫn là các bài kiểm tra PHPUnit). Ứng dụng thử nghiệm chức năng có quyền truy cập vào vùng chứa (http://symfony.com/doc/2.0/book/testing.html#accessing-internal-objects). Nếu bạn vẫn muốn sử dụng lớp kiểm tra đơn vị thông thường, hãy xem xét việc khởi tạo vùng chứa trong các bài kiểm tra đơn vị của bạn tại đây: https://gist.github.com/1319290 –

+0

Vậy bạn làm cách nào để thử nghiệm "unit" trên một lớp tải xuống tệp ? Nó sẽ luôn luôn được coi là thử nghiệm chức năng kể từ khi nó đạt đến bên ngoài của chính nó? – Craig

8

này làm việc cho tôi:

class MyServiceTest extends WebTestCase 
{ 
    public function testCookies() 
    { 
     $client = static::createClient(); 

     $myParams = $client->getKernel()->getContainer()->getParameter('my_params'); 
    } 
} 
+1

mặc dù tôi tự hỏi liệu có bất kỳ vấn đề nào với việc mở rộng WebTestCase cho các bài kiểm tra đơn vị (vì nó thường được sử dụng cho các bài kiểm tra chức năng) – timhc22

0

Tôi đang sử dụng Symfony 3.2.2, nhưng tôi nghĩ rằng điều này có thể làm việc cũng cho bạn.

Nó chỉ đơn giản một dòng:

$export_dir = static::$kernel->getContainer()->getParameter('export_dir'); 
Các vấn đề liên quan