簡體   English   中英

嘗試將我的步驟定義分解為多個文件(C#、NUnit、SpecFlow)時拋出 BoDi.ObjectContainerException

[英]BoDi.ObjectContainerException thrown when tried to break down my step definitions to multiple file (C#, NUnit, SpecFlow)

最初,我在 SpecFlow-C# 自動化測試中使用了單步定義,但是當它變得太長(約 2K 行)時,我嘗試分解為更小的部分。

我使用了一個基礎來處理我的鈎子(BeforeTestRun、BeforeScenario、AfterScenario、AfterTestRun),初始化驅動程序和日志記錄。 在 BeforeTestRun 中,我解析了一個配置文件以檢查我想在哪個瀏覽器上運行我的測試,並且在 BeforeScenario 中,我基於它初始化驅動程序。 所以像這樣:

[Binding]
public class TestBase
{

    protected TestBase()
    {}

    protected      IWebDriver    mDriver;
    private static log4net.ILog  mLogger;
    private static string        mCurrentBrowser;

    [BeforeTestRun]
    protected static void BeforeTestRun()
    {
        //Set up the logging and parse config file, give mCurrentBrowser a value
    }


    [BeforeScenario]
    protected void InitTest()
    {
        if ( mCurrentBrowser == "chrome" )
        {
            mDriver = new ChromeDriver();
        }
    }

    //And so on

}

我還有一個 CoreObjects 類,其中包含所有/大部分步驟定義文件使用的輔助方法。 它繼承自 TestBase。 有趣的部分是這樣的:

public class CoreObjects : TestBase
{

    protected CoreObjects( IWebDriver aDriver )
    {
        mDriver = aDriver;
    }

    // The rest of the class is helper methods
    // and private member variables used by a couple of helper methods
    // or protected member variables used by the step definitions

}

並且有8-10步定義文件。 它們類似於以下示例:

[Binding]
public class SampleStepDefClass : CoreObjects
{

    protected SampleStepDefClass ( IWebDriver aDriver )
        : base( aDriver )
    {  }

    [When( @"I do something" )]
    private void DoSomething( string aUrl )
    {
        mDriver.Url = aUrl;
        Thread.Sleep( 800 );
        string lCurrentUrl = mDriver.Url;
        Assert.IsTrue( lCurrentUrl.Contains( aUrl ) );
    }
}

還有一個靜態類,它啟動另一個靜態驅動程序並執行一些先決條件操作,但這應該不是問題,這是一個完全獨立的過程。 當我嘗試通過 Visual Studio 2015 運行 SpecFlow Scenarios 時,前置條件類中的前置條件靜態其他驅動程序會很好地執行其方法(它在 BeforeTestRun 掛鈎中調用)。 但是當具體的測試應該運行時,它只是打開和關閉瀏覽器(我的 mDriver)。

當我作為 Debug SpecFlow Scenarios 運行時,先決條件運行良好,但是(我使用 F11 逐步運行它以進入代碼行)調試器跳轉到我的第二個場景的第一步並拋出異常:

An exception of type 'BoDi.ObjectContainerException' occurred
in TechTalk.SpecFlow.dll but was not handled in user code

Additional information: Interface cannot be resolved:
OpenQA.Selenium.IWebDriver (resolution path: MyNamespace.MyFirstStepDefClass)

當我使用完全相同的方法和變量,但只在 TestBase 上使用綁定和(只有一個)StepDefinition 文件時,我的所有測試都運行良好。 我有一種感覺,要么是繼承,要么是構造函數把它搞砸了,但我對 C# 和 SpecFlow 還是很陌生,所以卡住了:-/ 除了我可能需要創建一個 ObjectContainer 的實例之外,真的找不到任何東西,並且使用作為參數傳遞的驅動程序調用 RegisterInstanceAs 函數。 但要么我做錯了,要么那不是解決方案。

謝謝!

您似乎已經可以通過繼承訪問驅動程序。 但是,是的,如果您希望將它注入構造函數中,則需要按照您說的那樣注冊它

我可能需要創建一個 ObjectContainer 實例,並使用作為參數傳遞的驅動程序調用 RegisterInstanceAs 函數

driver = new ChromeDriver();
objectContainer.RegisterInstanceAs(driver);

但我不確定你想讓你的基類也[綁定]。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM