【问题标题】:BoDi.ObjectContainerException thrown when tried to break down my step definitions to multiple file (C#, NUnit, SpecFlow)尝试将我的步骤定义分解为多个文件(C#、NUnit、SpecFlow)时引发 BoDi.ObjectContainerException
【发布时间】:2017-06-28 14:25:26
【问题描述】:

最初我为我的 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 场景时,前置条件类中的前置条件静态 other-driver 可以很好地执行其方法(它在 BeforeTestRun 挂钩中调用)。但是当具体测试应该运行时,它只是打开和关闭浏览器(我的 mDriver)。

当我作为 Debug SpecFlow 场景运行时,前置条件运行良好,但随后(我使用 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 函数并将驱动程序作为参数传递之外,真的找不到任何东西。但要么我做错了,要么这不是解决方案。

谢谢!

【问题讨论】:

    标签: c# exception selenium-webdriver nunit specflow


    【解决方案1】:

    您似乎已经可以通过继承访问驱动程序。但是是的,如果你想在构造函数中注入它,你需要像你所说的那样注册它

    我可能需要创建一个 ObjectContainer 的实例,然后调用 RegisterInstanceAs 函数就可以了,驱动程序作为参数传递

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

    但我不确定你是否想让你的 Base 类也 [Binding]。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      • 2011-07-16
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多