2

私はいつもこの問題を回避するために、残念ながらイベントの使用を減らしてきました。しかし、今回は気の利いたトリックを思いついたのですが、次のようなアプローチは適切ではないと思います。同じ結果を達成するための推奨される方法はありますか?

注意:しばらくしないと、ブレークポイントを設定しない限り、_args.Fixtureでnull参照例外が発生します-競合状態。

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

最初に、何らかのファイルを読み取る必要からテスト/フィクスチャを分離します。ファイルを解析できるかどうかをテストするか、予想されるイベントが発生するかどうかをテストします。

次に、バックグラウンドでの解析を避けます。すべてを同期的に行うため、これにより競合状態が明らかになります。

次に、有効なイベントが発生したかどうかを知らせるフラグを設定します。

例えば:

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);

これにより、パーサーがジョブを完了したことを確認できますが、どこかに問題があった場合、テストを実行したままにすることはできません。

ありがとうございます

于 2012-07-11T09:59:27.483 に答える