Ich habe einen Code auf Git Hub, der hier gefunden werden kann: https://github.com/Shaunus87/SyncTest, die meinen Prototyp-Code und meine Einheit Tests dafür enthält.Unit Test Synchroncode hat eine Race Condition?
ich meine Synchroncode im Wesentlichen erklären, ein Ereignis, Haken, eine Methode aufrufen, die schließlich das Ereignis nennen, und behaupten, ob das Ereignis aufgerufen wurde oder nicht:
bool called = false;
var testBinsToVend = GetRoboBins();
var vendHelper = new VendingHelper(null, testBinsToVend, VendType.Issue);
vendHelper.Complete += delegate() {
called = true;
};
vendHelper.DoVending();
Assert.IsTrue(called);
der gesamte Code synchron ist (wie Soweit ich weiß), aber wenn ich den Test ausführen, schlägt es fehl, wenn ich durch es debuggen, es passiert ...
Ich habe ein paar Dinge ausprobiert und es scheint entweder a) mein Code ist heimlich async und Ich habe eine Race-Bedingung oder b) wenn ich den Code ausführe, beschließt er, die Hälfte der Events nicht auszuführen?
Was zur Hölle?
Edit: ich auch versucht habe, wie unten ein manuelles Reset-Ereignis Einstellung:
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));
aber da es eine Zeile der Ausführung, wenn done.WaitOne();
getroffen wird der Test nie die Assert.IsTrue(called);
Linie erreicht.
Ich fand Hinweise auf 'System.Threading.Timer' drin, Sie ** sicher ** Ihr Code ist synchron? Von wo wird dieses Ereignis ausgelöst? Inside [Timer_Tick] (https://github.com/Shaunus87/SyncTest/blob/master/eVendVendingMachines/BaseVendingMachine.cs#L182)? Setzen Sie einen Haltepunkt auf diese Zeile "called = true;" und überprüfen Sie den Aufruf-Stack. Dadurch erhalten Sie wahrscheinlich alles, was Sie beim Debuggen wissen müssen. –