git hubにいくつかのコードをアップロードしました。ここには https://github.com/Shaunus87/SyncTestというプロトタイプコードとユニットテストが含まれています。ユニットテスト同期コードに競合条件がありますか?
私は基本的に、私の同期コードを宣言し、イベントをフックアップ、最終的にイベントを呼び出し、イベントが呼び出されたかどうかを主張するメソッドを呼び出します。
bool called = false;
var testBinsToVend = GetRoboBins();
var vendHelper = new VendingHelper(null, testBinsToVend, VendType.Issue);
vendHelper.Complete += delegate() {
called = true;
};
vendHelper.DoVending();
Assert.IsTrue(called);
すべてのコードが同期している(よう私が知っている限り)、まだ私はテストを実行すると、それを介してデバッグすると失敗します...
私はいくつかのことを試してみました。私は競合条件を持っているか、またはb)イベントの半分を実行しないことを決定したコードを実行しているとき?
何ですか?
編集: 私も以下のような手動リセットイベントを設定しようとしました:
bool called = false;
var done = new ManualResetEvent(false);
var testBinsToVend = GetRoboBins();
var vendHelper = new VendingHelper(null, testBinsToVend, VendType.Issue);
vendHelper.Complete += delegate() {
called = true;
done.Set();
};
vendHelper.DoVending();
done.WaitOne();
Assert.IsTrue(called);
//was complete called?
Assert.AreEqual(true, vendHelper.Bins.All(x => x.State != VendState.Pending));
しかしdone.WaitOne();
はテストがAssert.IsTrue(called);
ラインに到達したことはありませんヒットしたときには、実行の1行だから。
そこには 'System.Threading.Timer'の参照があります。**あなたのコードは同期していますか?そのイベントはどこから発射されたのですか?内部[Timer_Tick](https://github.com/Shaunus87/SyncTest/blob/master/eVendVendingMachines/BaseVendingMachine.cs#L182)?その 'called = true;'行にブレークポイントを置き、コールスタックを調べると、デバッグ中に知っておく必要があることが分かります。 –