2012-07-10 5 views
2

불행히도 -이 이벤트는 항상 덜 사용합니다. 그러나 이번에는 멋진 트릭을 생각해 냈지만, 다음 사항은 적절한 접근 방식으로 생각하지 않습니다. 동일한 결과를 얻기 위해 권장되는 방법이 있습니까?NUnit 테스트 이벤트 Args 데이터

NB 없이을 사용하면 _args.Fixture에 대한 널 참조 예외가 발생합니다.

private Parser _parser; 
private ParsedArgs _args;   

[TestFixtureSetUp] 
public void Setup() 
{ 
    _parser = new Parser(); 
    _parser.DataParsed += DataParsed; 
} 

void DataParsed(object sender, ParsedArgs e) 
{ 
    _args = e; 
} 

[Test] 
public void TestDocParse() 
{ 
    _parser.ParseFixture(File.ReadAllText(EventDataPath)); 

    while (_args == null || _args.Fixture == null) { } 

    Assert.IsNotNull(_args.Fixture); 
    var fixture = _args.Fixture; 
    Assert.AreEqual("2F7PY1662477", fixture.Id);    
} 
내가 the following는 구문 분석이 완료 할 수있는 잠재적으로 부정확 한 척도를 생각하는 데에지도 것을 발견

...

나는 fixture.Id가 "2F7PY1662477"같은지 테스트하는 것을 목표로하고있다 .

감사

+3

나는'사용합니다 vcsjones System.Threading.SpinWait.SpinUntil (() => _args = 널 (null) && _args.Fixture = NULL, 30000!!), 즉 '하나, 단지 확인하도록 테스트는 결코 루프에 걸리지 않습니다. 자동 재설정 이벤트 또는 이와 유사한 이벤트를 사용할 수도 있습니다. – vcsjones

+1

여기에 몇 가지가 있습니다. 하나는 파서가 완료 될 때까지 기다리는 중입니다. 두 개는 파서를 테스트하는 것뿐만 아니라 이벤트를 테스트하는 것입니다. while 루프를 완료하지 않고 _args.Fixture가 null이 아닌지 테스트하지 않기 때문에 테스트는 약간 의미가 없습니다. –

+0

Nah가 작동하지 ... 나는 단지 루프에 갇혀 있다는 것을 알고 있습니다. 당신은 내가 실제로 두 부분을 테스트하는 추가 문제를 제기합니다. –

답변

2

내가 먼저 읽을 수있는 파일이 어떤 종류의 요구에서 테스트/고정물을 분리합니다. 난 그냥 통조림 데이터를 ParseFixture에 보낼 것입니다 - 당신은 파일을 구문 분석 할 수 있는지 테스트 중이거나 예상 된 이벤트가 발생하는지 테스트 중입니다.

그런 다음 백그라운드에서 구문 분석을 피할 것입니다. 모든 것을 동 기적으로 수행하기 때문에 경쟁 조건이 밝혀 질 것입니다.

그러면 유효한 이벤트가 발생했는지 여부를 알리는 플래그가 있습니다. 예를 들어

:

private bool eventOccurred; 
private void DataParsed(object sender, ParsedArgs e) 
{ 
    eventOccurred = e.Id == "2F7PY1662477"; 
} 

[Test] 
public void TestDocParse() 
{ 
    _parser.ParseFixture(TextToParse); 
    Assert.IsTrue(eventOccurred); 
} 
+0

여전히 작동하지 않습니다. 구문 분석을 [TestFixtureSetup]으로 옮겨서 옮깁니다. 지금까지는 SpinWait이 가장 좋았습니다. 왜냐하면 시간 제한을 간단하게 추가 할 수 있기 때문입니다. –

+0

하지만 요점은 이벤트를 단순히 테스트하는 것이지 백그라운드에서 무언가가 일어나고있는 것은 아닙니다. 백그라운드에서 파싱을 피하면 스핀 기다림이나 잠시 기다릴 필요가 없습니다. –

+0

아, 미안하지만 어쩌면 명확하지 않을 수도 있습니다. Fixture ID가 정확하게 "2F7PY1662477"로 구문 분석되었는지 테스트하고 싶습니다. –

0
System.Threading.SpinWait.SpinUntil 
    (() => _args != null && _args.Fixture != null, 30000); 

이 어딘가에 문제가 있었는지, 그러나 그것은 실행 내 테스트를 떠나지 않을 것 파서가 작업을 완료되었는지 확인합니다.

덕분에

+0

당신은 여전히 ​​너무 많은 다른 것들을 테스트 중이다 ... –

+0

파스 메소드를 무효로 유지하면서 Id == "2F7PY1662477"을 테스트하려면 어떻게해야합니까? –

+1

예제가 보여줍니다. 어떻게하는지.이벤트 처리기 (DataParse)는 이벤트를 처리하고 ID가 예상 값임을 확인하는 이벤트를 처리 할 때 이벤트가 올바르게 발생했는지 확인합니다 (테스트 클래스에서 eventOccured 필드로 저장 됨). 그런 다음 테스트 메소드는 eventOccured가 true라고 주장합니다. 이는 ParseFixture가 동기이고 ParseFixture에서 반환되기 전에 이벤트가 발생했다고 가정합니다. 이것은 테스트에서 중요합니다. 테스트에서의 비동기는 정확하게 테스트하기가 어렵습니다. –

관련 문제