Inheritance 在定义文件的specflow步骤中使用基类属性调用的静态方法将属性引用为null

Inheritance 在定义文件的specflow步骤中使用基类属性调用的静态方法将属性引用为null,inheritance,selenium,tdd,specflow,Inheritance,Selenium,Tdd,Specflow,我的解决方案中有一个全局基类,我的所有测试都从该基类继承,该类包含公共IWebDriver属性。 我的项目基类继承自解决方案基类并初始化IWebDriver属性。 我的StepDefinition类继承自项目基类,BeforeCasenario属性调用初始化IWebDriver的项目基类TestInitialize 全局基类有TestCleanup标记来关闭IWebDriver会话,但它使用静态方法,当静态方法被调用时,该方法的属性之一是IWebDriver。IWebDriver值为null(在

我的解决方案中有一个全局基类,我的所有测试都从该基类继承,该类包含公共IWebDriver属性。 我的项目基类继承自解决方案基类并初始化IWebDriver属性。 我的StepDefinition类继承自项目基类,BeforeCasenario属性调用初始化IWebDriver的项目基类TestInitialize

全局基类有TestCleanup标记来关闭IWebDriver会话,但它使用静态方法,当静态方法被调用时,该方法的属性之一是IWebDriver。IWebDriver值为null(在方法内部),尽管我们传递它时它不是null

为什么我的静态方法将其视为null

[TestClass]
public class SolutionTestBase
{
    public IWebDriver WebDriver { get; protected set; }

    [TestCleanup]
    public void SubBaseTestCleanup()
    {
        if (WebDriver != null)
        {
            WebDriverFactory.QuitFromWebDriver(WebDriver, TestSettings);
        }
    }
}

[TestClass]
public class ProjectBaseTest : SolutionTestBase
{
    public void Initialize()
    {
        WebDriver = WebDriverFactory.GetDriverFromConfig(currBrowser.Name, TestContext);
    }
}

[Binding]
public class StepDefinitions : ProjectBaseTest
{
    [BeforeScenario("ConsoleAnalytics"), DataSource(BrowsersRef)]
    public void BeforeAnalyticsScenario()
    {
        Initialize();
    }
}

public class WebDriverFactory
{
    public static void QuitFromWebDriver(IWebDriver webDrivers, TestSettings testSettings, int milliSeconds = 200)
    {

        if (/*Some Code*/)
        {
            /*
             * 
             * Some Code
             * */
        }

        else if (testSettings == TestSettings.Local)
        {
            webDrivers.Quit();
        }

    }
}

您不应该在specflow和mstest之间混合测试设置/清理基础结构。SpecFlow是一个测试生成工具。它将为您生成
[Test]
[TestCleanup]
方法,因此您的类不应该使用它们


如果您希望在测试之后发生事情,那么您应该使用SpecFlow基础设施来完成这项工作,即使用SpecFlow中的
[AfterScenario]
标记谢谢,问题是VS正在调用[TestCleanup]和[AfterScenario]。如果我想从这个基类继承,有没有一种方法可以让VS不调用[TestCleanup]?正如我所说的,如果您使用的是specflow,您根本不应该使用[TestCleanup],因为这只会让事情变得混乱。您必须从类中删除所有单元测试属性,并且只使用specflow。将测试清理方法中的代码移动到标有[AfterScenario]的方法中,并让specflow为您处理。