私は、ASP.NETコアに、Threading.Timerを使用して一定の間隔で小さなタスクを実行するクラスを持っています(Timer.Timerはコアで利用できないため)。私はそれが期待待ち時間2.5秒とそう時間遅延を伴うC#ユニットテストはデバッグに成功しませんが、ビルドサーバでは失敗します
private class PeriodicalJobForTest : IPeriodicalJob
{
public int ExecutedCounter { get; private set; }
public void Execute(object state)
{
this.ExecutedCounter++;
}
}
:
[Fact]
public async void IntervalExecutionTest()
{
var target = new PeriodicaBackgroundJobRunner();
var testJob = new PeriodicalJobForTest();
target.Start(1/*run every second*/, testJob);
await Task.Delay(2500).ContinueWith(c =>
{
Assert.Equal(3, testJob.ExecutedCounter);
});
}
仕事のテストのために次のようになります。今、私は、ジョブが実行されたどのように多くの時間をチェックするユニットテストを書きました0,1,2で3回実行します。
デバッグでは、テストに合格します。ただし、ビルドサーバーは失敗し、「期待3、実際1」と表示されます。
どうしてですか?そこには何が違うの? Azureに実際に導入されると、生産上の問題も発生しますか?
注:Thread.Sleep()でも同じ結果が試されました。
念のために問題はテスト実装の下クラスで実際にあるかもしれない、クラスは次のようになります。
public class PeriodicaBackgroundJobRunner : IPeriodicaBackgroundJobRunner
{
private Threading.Timer timer;
public void Start(int interval, IPeriodicalJob job)
{
interval = Math.Max(interval, 1) * 1000;
if (this.timer == null)
{
this.timer = new Timer(new TimerCallback(job.Execute), null, Timeout.Infinite, interval);
}
this.timer.Change(0, interval);
}
public void Stop()
{
if (this.timer != null)
{
this.timer.Change(Timeout.Infinite, Timeout.Infinite);
}
}
}
は、まだ存在する問題ですか? – Kote
ですね。 –