2012-07-10 71 views
2

我一直在解决这个问题 - 不幸 - 使用事件少。然而这一次我想出了一个漂亮的窍门,但是我不认为以下将被认为是一个合适的方法。有没有推荐的方法来实现相同的结果?NUnit测试事件参数数据

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

我会用'System.Threading.SpinWait.SpinUntil(()=> _args = NULL && _args.Fixture = NULL,30000!);'为一体,只是为了确保您的测试永远不会陷入循环。你也可以使用自动重置事件,或类似的东西。 – vcsjones 2012-07-10 17:30:25

+1

这里有几件事。其中之一是,当然,你在“旋转”等待解析器完成。和两个,这不仅是测试解析器,还测试事件。测试有点没有意义,因为你永远不会完成while循环并测试_args.Fixture不为null。 – 2012-07-10 18:04:31

+0

Nah它确实有效......我只是意识到陷入循环。你提出了我实际上测试两个部分的进一步问题。 – 2012-07-11 09:00:41

回答

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,因为它允许简单地添加超时。 – 2012-07-11 09:20:51

+0

但重点是你想简单地测试事件,而不是事件发生在后台。如果你避免在后台解析,那么你不需要等待或旋转。 – 2012-07-11 16:11:01

+0

对不起,也许我还不清楚。我想测试Fixture Id已被正确解析为“2F7PY1662477”。 – 2012-07-12 10:14:38

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

这可以确保解析器已经完成了它的工作,但它不会离开我的测试运行,如果出现了问题的地方。

感谢vcsjones

+0

你还在测试太多不同的东西...... – 2012-07-12 14:06:03

+0

那么如何测试Id ==“2F7PY1662477”,同时保持解析方法返回无效? – 2012-07-13 11:27:05

+1

我的例子显示这个怎么做。事件处理程序(DataParse)处理事件,当它处理事件时它会验证Id是否为预期值,这将验证事件是否正确发生(存储为测试类中的eventOccured字段)。然后测试方法声明eventOccured是真实的。这假定ParseFixture是同步的,并且在从ParseFixture返回之前引发事件。这在测试中很重要;测试中的异步使得测试非常困难。 – 2012-07-13 15:16:59