2011-09-11 47 views
8

Behat theo mặc định sẽ tìm các định nghĩa bước trong tệp có tên FeatureContext (tất cả các bước trong một tệp).
Có rất nhiều bước, thật khó để duy trì một tệp lớn như vậy.Định nghĩa bước trong các tệp bên ngoài trong Behat

Tôi muốn có một tệp định nghĩa cho mỗi tệp tính năng.

Làm cách nào để có định nghĩa bước trong tệp bên ngoài?

ví dụ:

homepage.feature 
HomepageContext extends FeatureContext 

Trả lời

6

Sử dụng ngữ cảnh thừa kế và ngữ cảnh riêng biệt.

# /features/contexts/ 
AbstractContext extends BehatContext {} 
FeaturenameContext extends AbstractContext {} 

Sau đó, trong /feature/FeatureContext.php nhập khẩu các tập tin ngữ cảnh:

/** 
* Initializes context. 
* Every scenario gets it's own context object. 
* 
* @param array $parameters context parameters (set up via behat.yml) 
*/ 
public function __construct(array $parameters) { 

    // import all context classes from context directory, except the abstract one 

    $filesToSkip = array('AbstractContext.php'); 

    $path = dirname(__FILE__) . '/../contexts/'; 
    $it = new RecursiveDirectoryIterator($path); 
    /** @var $file SplFileInfo */ 
    foreach ($it as $file) { 
     if (!$file->isDir()) { 
      $name = $file->getFilename(); 
      if (!in_array($name, $filesToSkip)) { 
       $class = pathinfo($name, PATHINFO_FILENAME); 
       require_once dirname(__FILE__) . '/../context/' . $name; 
       $this->useContext($class, new $class($parameters)); 
      } 
     } 
    } 
} 
24

Behat có nhiều tùy chọn để bạn chia nhỏ FeatureContext thành nhiều lớp. Trước tiên, bạn có thể sử dụng kế thừa cũ của trường học php5. Nếu thừa kế không phải là những gì bạn muốn, Behat cũng hỗ trợ các điều khoản phụ: "Using Subcontexts".

Tiếp theo, nếu bạn muốn đặt tên lớp của mình khác với FeatureContext, bạn có thể xác định lại điều đó trong phần "Context Configuration" trong tệp cấu hình behat.yml của mình.

Bằng cách này, bạn có thể tách các định nghĩa và móc phổ biến thành các lớp riêng biệt và sử dụng chúng trong các bộ tính năng khác cũng như với cả subcontexting hoặc thừa kế.

Nhưng câu hỏi của bạn cũng hỏi:

Tôi muốn có một tập tin định nghĩa cho mỗi tập tin tính năng.

Yêu cầu này hoàn toàn sai. Bối cảnh và kịch bản BDD là tất cả về mô tả hành vi ứng dụng của bạn trong điều kiện kinh doanh và tạo từ điển kiểm tra cho các hành vi được mô tả. Lưu ý rằng, về mặt logic, bạn không thể có nhiều từ điển khác nhau cho một tập hợp tính năng. Bằng cách viết các định nghĩa bước, bạn đang nói với Behat những gì mà Given I am on "/news" có nghĩa là. Và khi bạn muốn bước đó có nghĩa là những thứ khác nhau từ tính năng đến tính năng - bạn đang làm sai.

Behat bao gồm 2 khái niệm riêng biệt chính và đủ:

  1. *.feature file, viết bằng ngôn ngữ Gherkin. Những tệp đó phải tự mô tả. Có nghĩa là, họ nên cung cấp tất cả thông tin cho người đọc để hiểu họ. Gherkin không phải là một ngôn ngữ lập trình mới cho các bài kiểm tra chức năng của bạn, nó chỉ là một dấu hiệu markdown cho các câu chuyện của bạn!
  2. FeatureContext.php lớp học, mô tả cách Behat nên kiểm tra các tính năng của bạn. Nó định nghĩa từ điển ứng dụng rộng rãi được sử dụng với toàn bộ ứng dụng bộ tính năng. Đây là cầu nối lập trình giữa các dấu kiểm của giống như câu chuyện người dùng và các thử nghiệm chức năng thực tế.

Và bạn không nên gây rối điều này. Bộ tính năng đơn nên có từ điển đơn (định nghĩa). Nhưng bạn có thể sử dụng từ điển đơn trong nhiều hơn một bộ tính năng nhờ thừa kế và các phụ lục. Và có, bạn có thể chia từ điển bộ đơn thành nhiều lớp học php ;-)

+0

Tôi hiểu bạn đến từ đâu nhưng bạn quên mất nỗi đau khi duy trì thông số kỹ thuật của mình? Điểm của Sfisioza (tôi đoán) là về điều này. Nếu ai đó có một hệ thống phức tạp, người ta có thể trải qua nỗi đau như vậy khi đi qua FeatureContext.php – RVM

0

Một giải pháp là dùng lại ngang với subContexts. Sử dụng một SubContext cho mỗi "nhóm tính năng".

class FeatureContext extends BehatContext 
{ 

    public function __construct(array $context_parameters) 
    { 
     $this->useContext('math_context', new MathContext()); 
     $this->useContext('bash_context', new BashContext()); 
    } 
} 
+0

Điều này đúng với phiên bản 2.x của Behat. Phương thức 'useContext' đã được gỡ bỏ trong Behat 3.x. –

+0

Điều gì sẽ là thay thế cho useContext trong Behat3? –

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