2017-09-18 148 views
1

我讀過使用繼承是不可能的,當使用Specflow時,這在大多數情況下是有意義的。但是,我遇到了似乎需要正確使用繼承的情況。這裏是我的課:Specflow中的繼承測試步驟導致模糊步驟

基類

public class StepBaseClass 
{ 
    protected readonly ScenarioContext scenarioContext; 

    public StepBaseClass(ScenarioContext scenarioContext) 
    { 
     this.scenarioContext = scenarioContext; 
    } 
} 

首先繼承的類:

[Binding] 
    public class StudioEnterpriseImportConnectorSteps:StepBaseClass 
    { 
     public StudioEnterpriseImportConnectorSteps(ScenarioContext scenarioContext) :base(scenarioContext) 
     { 

     } 
     [Given(@"I have a data record that I want to send to the import service")] 
     public void GivenIHaveADataRecordThatIWantToSendToTheImportService() 
     { 
      scenarioContext.Pending(); 
     } 

     [When(@"I send the information to an invalid URL")] 
     public void WhenISendTheInformationToAnInvalidURL() 
     { 
      scenarioContext.Pending(); 
     } 

     [Then(@"an error should be generated")] 
     public void ThenAnErrorShouldBeGenerated() 
     { 
      scenarioContext.Pending(); 
     } 
    } 

第二個繼承類:

[Binding] 
    public class SitemapSteps:StepBaseClass 
    { 
     public SitemapSteps(ScenarioContext scenarioContext):base(scenarioContext) 
     { 
     } 
     [When(@"I visit the URL (.*)")] 
     public void WhenIVisitTheSitemapURL(string URL) 
     { 
      scenarioContext.Add("result", TestUtilities.GetResponseCode(URL)); 
      scenarioContext.Add("response", TestUtilities.GetResponseBody(URL)); 
     } 

     [Then(@"the response code should be (.*)")] 
     public void ThenTheResponseCodeShouldBe(string responseCode) 
     { 
      HttpStatusCode result = scenarioContext.Get<HttpStatusCode>("result"); 
      Assert.Equal(responseCode, result.ToString()); 
     } 
    } 

正如你所看到的,我繼承了scenarioContext,這是我爲了編寫多線程測試而需要做的事情。因此,我不希望爲每個類重複這段代碼,而希望能夠從基類繼承。初始化該變量的適當方法是什麼,以便我可以在每個派生類中使用它?

+0

小記一下措辭:你寫的每一個綁定類的代碼,不測試。綁定是全球性的,您不必爲每個功能/場景再次編寫它。 –

+0

謝謝@AndreasWillich。你是對的。我已更新我的語言。 –

回答

0

在Specflow測試鉤初始化我的依賴注入後,我將有一個帶有靜態解析方法稱爲ApplicationContext類將返回我我ScenarioContext例如像這樣:

public class ApplicationContext 
{ 
    public static T Resolve<T>() where T: class 
    { 
     return container.GetInstance<T>(); 
    } 
} 

然後在我的步級,我就解決了ScenarioContext這樣的:

scenarioContext = (ScenarioContext)ApplicationContext.Resolve<IScenarioContext>(); 
1

正確的方式總是取決於你的個人situaion。 我建議不要使用基類,並在任何地方使用上下文注入。在構造函數中重複使用的少量代碼對於您的綁定及其實現的良好分離和拆分來說是一個小代價。

要獲取有關此主題的更多信息,加斯帕爾·納吉寫了一步基類的SpecFlow利弊一篇好的博客文章: http://gasparnagy.com/2017/02/specflow-tips-baseclass-or-context-injection/