2012-02-06 26 views
6

Tôi có một ứng dụng giao diện điều khiển, (viết như một lệnh Symfony2) được đọc đầu vào từ người dùng thông qua STDIN và với sự giúp đỡ của readline, người dùng nhập vào sau đó được truyền cho eval()Làm thế nào để viết đơn vị xét nghiệm cho giao diện điều khiển ứng dụng tương tác

Toàn bộ điều chỉ là để có "gỡ lỗi vỏ" (một cái gì đó giống như một php -a) nhưng trong dự án env và truy cập container Dependency Injection.

Tôi muốn viết đơn vị kiểm tra cho lệnh này nhưng tôi đánh tường, về cách (và có thể) viết PHPUnit kiểm tra cho hành vi này?

Trả lời

7

Tôi không quen với điều SF2 lệnh, nhưng các tài liệu SF2 có một ví dụ về thử nghiệm nó tại http://symfony.com/doc/2.0/components/console.html#testing-commands

Nói chung, bạn có thể tách STDINSTDOUT từ ứng dụng giao diện điều khiển của bạn, do đó bạn có thể thay thế nó bằng tài nguyên luồng khác, như fopen(php://memory). Thay vì readline, bạn sử dụng

fwrite($outputStream, 'Prompt'); 
$line = stream_get_line($inputStream, 1024, PHP_EOL); 

Ý tưởng là để làm cho thành phần kiểm chứng của bạn mà không đòi hỏi môi trường console thực. Sử dụng phương pháp này cho phép bạn kiểm tra nội dung của Luồng bất kỳ lúc nào trong bài kiểm tra của bạn. So if you run Command "foo" in your console app and want to test that the output is "bar" you simply rewind the appropriate resource and read it's content. Cách khác là sử dụng SplTempFileObject.

class ConsoleApp 
… 
    public function __construct($inputStream, $outputStream) 
    { 
     $this->inputStream = $inputStream; 
     $this->outputStream = $outputStream; 
    } 
} 

Trong kịch bản thế giới thực của bạn, bạn muốn tạo ra các ứng dụng điều khiển với

$app = new ConsoleApp(STDIN, STDOUT); 

Nhưng trong thử nghiệm của bạn, bạn có thể thiết lập các ConsoleApp với một dòng của sự lựa chọn của bạn:

public function setup() 
{ 
    $i = fopen('php://memory', 'w'); 
    $o = fopen('php://memory', 'w'); 
    $this->consoleApp = new ConsoleApp($i, $o); 
} 

Một ví dụ về một UnitTest sử dụng phương pháp này cho outstream sẽ là

+1

Xin cảm ơn :) – canni

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