2

我总是通过 - 不幸的是 - 减少使用事件来解决这个问题。然而这次我想出了一个漂亮的技巧,但我不认为下面会被认为是一个合适的方法。有没有推荐的方法来达到相同的结果?

注意:如果没有在_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);            
}

我发现以下导致不得不考虑一个可能不准确的时间尺度来完成解析......

我的目标是测试fixture.Id 是否等于“2F7PY1662477”。

谢谢

4

2 回答 2

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);
}
于 2012-07-10T18:15:28.393 回答
0
System.Threading.SpinWait.SpinUntil
    (() => _args != null && _args.Fixture != null, 30000);

这可以确保解析器完成了它的工作,但是如果某处出现问题,它不会让我的测试继续运行。

谢谢 vcsjones

于 2012-07-11T09:59:27.483 回答