NUnit Specflow how to share a class instance for all tests

I am using Specflow with NUnit and Selenium and want to share instance of driver across all tests. I can do do this up to feature level with FeatureContext but can't see anything for all tests. I am aware that this is probably not the right way to go but I want to know if there is a way.

Please help with example(s).

Thanks


Solution 1:

There are a few ways to do this. Most are covered on this page

What I personally would probably do is define a SeleniumContext class and require this class in all my Step class constructors, then tell SpecFlow's IOC to use the same instance in every scenario:

First create the class to hold the selenium driver instance

public class SeleniumContext
{
     public SeleniumContext()
     {
          //create the selenium context
          WebDriver = new ...create the flavour of web driver you want
     }

     public IWebDriver WebDriver{get; private set;} 
}

then setup the IOC to return the same instance every time

[Binding]
public class BeforeAllTests
{
    private readonly IObjectContainer objectContainer;
    private static SeleniumContext seleniumContext ;

    public BeforeAllTests(IObjectContainer container)
    {
        this.objectContainer = container;
    }

    [BeforeTestRun]
    public static void RunBeforeAllTests()
    {
        seleniumContext = new SeleniumContext();
     }

    [BeforeScenario]
    public void RunBeforeScenario()
    {            
        objectContainer.RegisterInstanceAs<SeleniumContext>(seleniumContext );
    }
}

Then ensure your step classes always ask for the context in their constructors (you need to do this in every step class you have)

[Bindings]
public class MySteps
{
    private SeleniumContext seleniumContext;

    public MyClass(SeleniumContext seleniumContext)
    {
         //save the context so you can use it in your tests
         this.seleniumContext = seleniumContext;
    }

    //then just use the seleniumContext.WebDriver in your tests
}

alternatively if you are already storing the instance in the feature context then you can just use the BeforeFeature hook to save the same instance:

[Binding]
public class BeforeAllTests
{
    private static WebDriver webDriver;

    [BeforeTestRun]
    public static void RunBeforeAllTests()
    {
        webDriver = new WebDriver();
     }

    [BeforeFeature]
    public static void RunBeforeFeature()
    {
        FeatureContext["WebDriver"] = webDriver;
     }

}