2017-02-10 1 views
1

처음에는 SpecFlow-C# 자동화 테스트에 단일 단계 정의를 사용했지만 너무 길면 (~ 2K 줄), 나는 더 작은 조각으로 분해하려고 노력했다.BoDi.ObjectContainerException이 내 단계 정의를 여러 파일 (C#, NUnit, SpecFlow)로 분해하려고 시도했을 때

내 후크 (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)); 
    } 
} 

는 또한 다른 정적 드라이버를 발생시키는 정적 클래스가 일부 preconditional 작업을 할 수 있지만,이 문제가되지해야한다, 그건 완전히 분리 과정입니다. Visual Studio 2015를 통해 SpecFlow 시나리오를 실행하려고 할 때, 전제 조건의 정적 전제 조건 - 드라이버가 메소드를 잘 수행합니다 (BeforeTestRun 후크에서 호출 됨). 그러나 구체적인 테스트가 실행될 때 브라우저 (mDriver)를 열거 나 닫을뿐입니다.

디버그 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 함수를 호출하십시오. 그러나 나는 잘못했거나 해결책이 아닙니다.

감사합니다.

답변

1

이미 상속을 통해 드라이버에 액세스 할 수있는 것 같습니다. 생성자에 주입하고자하는 경우 나는 ObjectContainer의 인스턴스를 생성해야하고, 전달 된 드라이버로에 RegisterInstanceAs 함수를 호출 할 수

말에 언급 한 바와 같이하지만, 그래, 당신은 등록해야 매개 변수

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

그러나 나는 당신이 당신의 기본 클래스는 [바인딩] 만들고 싶어 모르겠어요있다.

관련 문제