2012-09-25 27 views
10

Tôi có một số tệp tính năng với một số trường hợp. Tôi cần bỏ qua một số kịch bản hoặc tính năng, được đánh dấu bằng một số @tag tùy thuộc vào một số điều kiện. Tôi đã đọc specflow documentation nhưng không tìm thấy cái gì đó có thể hữu ích cho giải pháp của tôi. Tôi muốn sử dụng cái gì đó nhưLàm thế nào để bỏ qua một số kiểm tra chấp nhận bằng cách sử dụng TechTalk.SpecFlow và C#?

[BeforeScenario("sometag")] 
public static void BeforeScenario() 
{ 
    if(IgnoreTests) 
    { 
     // This is the hot spot 
     Scenario.DoSomethingToIgnoreScenarioIfConditionButRunScenarioIfConditionFalse(); 
    }   
} 

Ngoài ra tôi đã cố gắng tự động thêm hoặc xóa thẻ

[BeforeScenario("sometag")] 
public static void BeforeScenario() 
{ 
    if(IgnoreTests) 
    { 
     ScenarioContext.Current.ScenarioInfo.Tags.ToList().Add("ignore"); 
    }   
} 

nhưng nó đã không làm việc. Có thể có cách nào khác để tự động thêm hoặc xóa thẻ? Hoặc một số phương pháp trong lớp ScenarioContext sẽ bỏ qua trường hợp hiện tại?

Trả lời

21

Bạn có ít nhất 3 lựa chọn:

  1. Configure Specflow để điều trị cấp phát bước như bỏ qua với missingOrPendingStepsOutcome="Ignore" sau đó bạn có thể viết:

    if(IgnoreTests) 
    { 
        ScenarioContext.Current.Pending(); 
    } 
    

    Nó có lẽ không phải những gì bạn muốn tùy thuộc vào bạn yêu cầu cho các bước đang chờ xử lý.

  2. Sử dụng khung kiểm tra đơn vị được xây dựng trong phương pháp để bỏ qua thử nghiệm trong suốt thời gian chạy. Vì vậy, nếu bạn đang sử dụng ví dụ: NUnit sau đó với số Assert.Ignore():

    if(IgnoreTests) 
    { 
        Assert.Ignore(); 
    } 
    

    Tôi nghĩ đây là giải pháp sạch/dễ nhất.

  3. Hoặc nếu bạn muốn làm điều đó một thử nghiệm cách khung-agnostic và bạn không sợ để gây rối với internals Specflow sau đó bạn có thể sử dụng giao diện IUnitTestRuntimeProvider:

    if (IgnoreTests) 
    { 
        var unitTestRuntimeProvider = (IUnitTestRuntimeProvider) 
        ScenarioContext.Current 
         .GetBindingInstance((typeof (IUnitTestRuntimeProvider))); 
        unitTestRuntimeProvider.TestIgnore("ignored"); 
    } 
    

    này sẽ làm việc ngay cả khi bạn thay đổi của bạn đơn vị thử nghiệm nhưng nó không đảm bảo rằng API này sẽ không phá vỡ trong tính năng này.