![](/img/trans.png)
[英]BoDi.ObjectContainerException : Interface cannot be resolved in Specflow test
[英]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.