2013-03-18 29 views
9

Có thể có một lớp subcontext mở rộng một chức năng phụ và ghi đè khác không?Có thể ghi đè các định nghĩa bước trong ngữ cảnh không?

Hiện nay tôi có

class TestContext extends BehatContext { 
    /** 
    * @Given /^a testScenarioExists$/ 
    */ 
    public function aTestscenarioexists() { 
     echo "I am a generic test scenario\n"; 
    } 
} 

class SpecialTestContext extends TestContext { 
    /** 
    * @Given /^a testScenarioExists$/ 
    */ 
    public function aTestscenarioexists() { 
     echo "I am a special test scenario\n"; 
    } 
} 

Trong bối cảnh tính năng tôi nói với nó chúng ta SpecialTestContext như một subcontext.

Khi tôi chạy thử nghiệm behat phàn nàn với

[Behat \ Behat \ Exception \ RedundantException]
Bước "/^a/testScenarioExists $" đã được xác định trong SpecialTestContext :: aTestscenarioexists()

Ai đó có thể vui lòng chỉ cho tôi đúng hướng với điều này không?

Để cung cấp thêm thông tin về lý do tôi cố gắng đạt được điều này, tôi cố gắng đạt được khả năng chạy kịch bản với môi trường khác nhau và có môi trường được chỉ định trong tệp gherkin, ví dụ:

Scenario: Test with generic environment 
Given I am in the environment "generic" 
    And a test scenario exists 

Scenario: Test with specialised environment 
Given I am in the environment "specialised" 
    And a test scenario exists 

Sau đó tôi có thể sử dụng thêm một số mã trong FeatureContext để tải lên đúng ngữ cảnh phụ.

Trả lời

4

Nói tóm lại ... Đây là không thể: http://docs.behat.org/guides/2.definitions.html#redundant-step-definitions

Về tải subcontexts động, điều này là không thể:

  1. Subcontexts được nạp vào 'biên dịch thời gian' - tức là. trong constructor FeatureContext chính
  2. Vào thời điểm định nghĩa Bước đầu tiên là chạy, behat đã thu thập tất cả các chú thích và ánh xạ chúng bước định nghĩa, không còn có thể/nên được bổ sung

Kiểm tra này ra để hiểu làm thế nào một Context cư xử: http://docs.behat.org/guides/4.context.html#contexts-lifetime

Vài điều rộng hơn để xem xét:

  1. Bất cứ điều gì bị bắt trong một kịch bản mus dưa chuột t có thể hiểu được bởi những người không phải là nhà phát triển, (hoặc ít nhất là các nhà phát triển không viết hệ thống!).Một kịch bản nên truyền đạt đầy đủ, một (lý tưởng không phải là) quy tắc kinh doanh mà không cần phải đào sâu vào bất kỳ mã nào

  2. Bạn không muốn ẩn quá nhiều logic trong định nghĩa bước, bất kỳ quy tắc nào cũng phải được ghi lại trong kịch bản dưa chuột

  3. Nó tùy thuộc vào bạn như thế nào bạn tổ chức FeatureContexts bạn, tuy nhiên bạn sẽ muốn làm điều này theo chủ đề/lĩnh vực trong hệ thống của bạn, ví dụ:

    • một DatabaseContext chưa quan tâm đến việc đọc sách + viết cho một thử nghiệm db
    • một ApiContext có thể chứa các bước liên quan đến việc xác nhận một api trong hệ thống của bạn
    • một CommandContext có thể được quan tâm với việc chứng thực hệ thống giao diện điều khiển của bạn lệnh
+0

Chỉ cập nhật các liên kết được cung cấp ở trên. * http://docs.behat.org/en/latest/user_guide/context/definitions.html#redundant-step-definitions * http://docs.behat.org/en/latest/user_guide/context. html # contexts-lifetime – aczietlow

9

Như Rob Squires đã đề cập, việc bốc bối cảnh năng động sẽ không hoạt động.

Nhưng tôi có giải pháp thay thế định nghĩa bước mà tôi thường xuyên sử dụng. Không chú thích phương thức của bạn. Behat sẽ nhận chú thích của phương thức được ghi đè trong lớp cha và sẽ ánh xạ tên phương thức đó cho bước phù hợp. Khi tìm thấy một bước phù hợp, phương thức trong lớp con của bạn sẽ được gọi. Để làm cho nó rõ ràng, tôi đã sử dụng chú thích @override cho việc này. Chú thích @override không có ý nghĩa đặc biệt đối với Behat.

class SpecialTestContext extends TestContext { 
    /** 
    * @override Given /^a testScenarioExists$/ 
    */ 
    public function aTestscenarioexists() { 
     echo "I am a special test scenario\n"; 
    } 
} 
+1

Đây là giải pháp thực sự - các phương thức ghi đè trong phân lớp, mà không thay đổi kiểu mẫu quảng cáo. –

0

Không thể xác định phương pháp ghi đè với cùng một câu.

class SpecialTestContext extends TestContext { 

    public function aTestscenarioexists() { 
    echo "I am a special test scenario\n"; 
    } 
}