2011-11-02 1 views
0

NUnitを使用してスケジューラをユニットテストする方法。これはOutlookスケジュールと同様のスケジューリング機能を可能にしますか?NUnitを使用してユニットテストスケジューラを作成する方法

スケジューラは、特定の時刻または特定の曜日/月に毎日/毎週/毎月/毎年メッセージを送信するようにプログラムされています。

ハードコーディングされた日付を使用すると、いつかテストケースが失敗します。また、毎月および毎年のスケジュールをテストする方法?

- 別のインターフェイスに、スケジューラのチェック

ラム

+1

を対処するほくろのようなツールを使用することができます – sll

答えて

1

抽象日付と時刻。あなたのライブコード/環境(DateTimeを使用するか、現在使用されているもの)用にこのインタフェースを実装するクラスと、テスト環境用に実装して時間を加速/変更できるクラスがあります。そのようにすれば、時間ベースの機能を迅速かつ迅速にテストできます。

非常に簡単な例は、これはあなたのスケジューラによって異なります:

public interface IDateTimeProvider 
{ 
    DateTime CurrentDateTime { get; } 
} 

public class DateTimeProvider : IDateTimeProvider 
{ 
    public DateTime CurrentDateTime 
    { 
     get { return DateTime.Now; } 
    } 
} 

public class TestDateTimeProvider : IDateTimeProvider 
{ 
    public DateTime CurrentDateTime { get; set; } 
} 

public class Scheduler 
{ 
    private readonly IDateTimeProvider DateTimeProvider; 

    public Scheduler(IDateTimeProvider provider) 
    { 
     DateTimeProvider = provider; 
    } 
} 
1

ある時点での時間であなたは、スケジューラは、現在の日付を確認し、予定の項目に対してそれをチェックしますね。

「現在の日付を確認」の部分が別のコンポーネントで区切られていることを確認した場合は、単体テストでこの動作を切り替えて、指定した日付を返すことができます。

パブリックインターフェイスIDateTimeManager { DateTime GetCurrentDateTime(); }

class ProductionDateTimeManager : IDateTimeManager 
    { 
     public DateTime GetCurrentDateTime() 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    public class Scheduler 
    { 
     public Scheduler(IDateTimeManager dateTimeManager) 
     { 
      this.DateTimeManager = dateTimeManager; 
     } 

     public Scheduler() 
     { 
      this.DateTimeManager = new ProductionDateTimeManager(); 
     } 

     public void Execute() 
     { 
      DateTime current = DateTimeManager.GetCurrentDateTime(); 
     } 

     private IDateTimeManager DateTimeManager { get; set; } 
    } 
関連する問題