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