2011-12-05 37 views
6

Tôi đang tìm cách kết hợp một khuôn khổ thử nghiệm vào một dự án mà tôi đang xây dựng và đã xem qua số Enhance PHP mà tôi thích nhưng tôi gặp khó khăn trong việc tìm kiếm thông tin có liên quan trực tuyến kể từ khi "nâng cao php" một cụm từ thường được sử dụng.Bắt đầu với "Nâng cao PHP"

Có ai đã làm việc với khuôn khổ này có thể chỉ cho tôi hướng dẫn một số hướng dẫn hữu ích không? Bạn đã từng làm việc với một khung kiểm thử đơn vị mà bạn nghĩ là tốt hơn đáng kinh ngạc chưa?

Xin cảm ơn trước.

Để đối phó với Gotzofter, đây là lớp học để được kiểm tra:

<?php 
include_once('EnhanceTestFramework.php'); 

class ExampleClass 
{ 
    private $OtherClass; 

    function __construct($mock = null) 
    { 
     if ($mock == null) 
      $this->OtherClass = new OtherExampleClass(); 
     else 
      $this->OtherClass = $mock; 
    } 

    public function doSomething() 
    { 
     return $this->OtherClass->getSomething(1, 'Arg2'); 
    } 
} 

class OtherExampleClass 
{ 
    public function getSomething() 
    { 
     return "Something"; 
    } 
} 

class ExampleClassTests extends \Enhance\TestFixture 
{ 
    public function setUp() 
    { 
    } 

    public function tearDown() 
    { 
    } 

    public function verifyWithAMock() 
    { 
     $mock = \Enhance\MockFactory::createMock('OtherExampleClass'); 
     $mock->addExpectation(
      \Enhance\Expect::method('getSomething') 
       ->with(1, 'Arg2') 
       ->returns('Something') 
       ->times(1) 
      ); 
     $target = new ExampleClass($mock); 
     $result = $target->doSomething(); 
     \Enhance\Assert::areIdentical("Something", $result); 

     $mock->verifyExpectations(); 
    } 
} 

\Enhance\Core::runTests(); 

nhìn vào constructor của tôi cho ExampleClass. Bởi vì ví dụ trang web nâng cao-php tiêm đối tượng $ giả bằng cách gọi mới ExampleClass ($ mock), tôi buộc phải thay đổi hàm tạo của ExampleClass để xử lý $ mock làm tham số đầu vào.

Tôi có phải xử lý điều này cho tất cả các lớp mà tôi muốn kiểm tra đơn vị với khung không?

Cảm ơn.

+1

[enhanced-php.com] (http://www.enhance-php.com) chứa [Hướng dẫn bắt đầu nhanh] (http://www.enhance-php.com/Content/Quick-Start-Guide /) và nó cũng có vẻ như họ có [tài liệu phong nha về tất cả các tính năng chính] (http://www.enhance-php.com/Content/Documentation/). Chính xác những gì bạn đang tìm kiếm vượt ra ngoài đó? –

+9

[PHPUnit] (http://phpunit.de) là khung kiểm tra đơn vị defacto. TBH Tôi chưa bao giờ nghe nói về Enhance (đừng coi đó là một cảnh quay rẻ tiền, chỉ là trung thực). –

+0

@Colin - Có lẽ tôi không hiểu cách sử dụng Mock. Làm theo hướng dẫn trong hướng dẫn đó tôi không nhận được kết quả mong đợi. Tôi sẽ thêm một số mã vào bài đăng gốc – baiano

Trả lời

3

này:

function __construct() 
{ 
    $this->OtherClass = new OtherExampleClass; 
} 

nên là:

function __construct($otherClass) 
{ 
    $this->OtherClass = $otherClass; 
} 

giả của bạn không bao giờ được tiêm vào thời điểm này trong thử nghiệm của bạn:

$target = new ExampleClass($mock); 
+0

Tôi đã chỉnh sửa bài đăng gốc. Đó là những gì bạn có nghĩa là bằng câu trả lời của bạn? – baiano

+1

Tôi sẽ không chính xác làm một hàm tạo trong đó bạn có một đối tượng tạo mặc định. Chỉ cần ở lại với tiêu chuẩn ** Dependency Injection ** Ngoài ra, phương thức 'something' có các tham số trong thử nghiệm của bạn, nhưng nó không được thực hiện. – Gutzofter

+0

Đó là những gì tôi đã cố gắng tìm ra. Tiêu chuẩn Dependency Injection .. là gì? Các ví dụ về nâng cao hướng dẫn của PHP không hiển thị toàn bộ hình ảnh và mã ở trên là cách duy nhất mà tôi có thể làm cho các bài kiểm tra hoạt động. – baiano

1

Một điều tôi muốn giới thiệu không có vấn đề gì khuôn khổ thử nghiệm bạn đang sử dụng là loại gợi ý dựa vào lớp hoặc giao diện được mong đợi.

<?php 
class ExampleClass 
{ 
    private $OtherClass; // OtherClass instance 

    public function __construct(OtherClass $OtherClass=null) 
    { 
     // ... 
    } 
} 

Tôi không phải chuyên gia di, nhưng tôi không thấy có vấn đề trong việc để mỗi cuộc gọi lớp mới nếu một thể hiện không được cung cấp cho một sự phụ thuộc cụ thể. Bạn cũng có thể sử dụng cách tiếp cận nơi bạn sử dụng các phương thức setter để cấu hình các phụ thuộc.

<?php 
class class ExampleClass 
{ 
    private $OtherClass; // OtherClass instance 

    public function setOtherClass(OtherClass $OtherClass) 
    { 
    $this->OtherClass = $OtherClass; 
    } 
} 

Đó là khập khiễng rằng ExampleClass trong mã mẫu thậm chí không xác định doSomething phương pháp từ ExampleDependencyClassTests, nhưng nếu tôi hiểu đúng nó trông giống như Tăng cường PHP không được buộc bạn có một kiểu tiêm phụ thuộc cụ thể. Bạn có thể viết các lớp thử nghiệm tuy nhiên bạn muốn, ví dụ như vậy nếu bạn đã tiếp cận phương pháp setter tôi đã đề cập ở trên, bạn có thể thay đổi ví dụ mã giả để

<?php 
class ExampleDependencyClassTests extends \Enhance\TestFixture 
{ 
    public function verifyWithAMock() 
    { 
     $mock = \Enhance\MockFactory::createMock('ExampleDependencyClass'); 
     $mock->addExpectation(
      \Enhance\Expect::method('getSomething') 
      ->with(1, 'Arg2') 
      ->returns('Something') 
      ->times(1) 
     ); 
     $target = new ExampleClass(); 
     $target->setExampleDependencyClass($mock); 
     $result = $target->doSomething(); 
     $mock->verifyExpectations(); 
    } 
} 

Tất nhiên nó probly sẽ làm cho tinh thần để làm cho thích hợp sửa đổi cho ExampleClass!

<?php 
class ExampleClass 
{ 
    private $ExampleDependencyClass; 

    public function addTwoNumbers($a, $b) 
    { 
     return $a + $b; 
    } 

    public function setExampleDependencyClass(
     ExampleDependencyClass $ExampleDependecyClass 
    ) { 
     $this->ExampleDependecyClass = $ExampleDependecyClass; 
    } 

    public function doSomething($someArg) 
    { 
     return 'Something'; 
    } 
} 

Tôi đã làm việc với PHPUnit khá một chút, và thành thật, bạn sẽ phải đối mặt với những thách thức tương tự với Mocks đó. 2 xu của tôi, hãy thử lập mô hình thử nghiệm của bạn mà không cần Mocks nếu có thể;)