2017-03-12 4 views
-4

.NETにモックライブラリがありますか?moqなど、モックライブラリが私にとって問題ないシステム時間をモックすることができますか?.NETにはシステム時間を模擬できるモックライブラリはありますか?

+3

質問がオフトピックスタックオーバーフローのためにある書籍、ツール、ソフトウェアライブラリ、チュートリアルや他のオフサイトのリソースをお勧めしますか見つけるために私たちを求めて。代わりに、問題を説明し、それを解決するためにこれまでに何が行われているかを記述します。 –

+2

私はこの質問は話題にはならないと意見を異にします。 OPは非常に特殊な機能を求めています。それが異なって言われた場合、例えば。 "どのように私は.NETでシステム時間を模擬することができます"、誰も話題を外すように投票することを考えることはありません。たぶん、この質問は、手紙の "ツールなしの勧告"ルールを破るが、精神ではない。 –

+2

@Adam Lee、私は、あなたの質問をThomas Levesqueとして言い換えることをお勧めします。 –

答えて

3

ありDateTime.Nowのようなものを模擬することができますTypeMock IsolatorまたはMicrosoft Fakesのようなツールがありますが、それらは(TypeMockアイソレーターのためにあなたは、少なくとも「エッセンシャル」版を必要とし、MS偽物のためには、Visual Studioのエンタープライズを必要とする)無料ではないです。

しかし、あなたは本当にそれを必要としません。 DateTime.Nowを嘲笑するのではなく、その上に抽象化を作成することができ、その抽象化を嘲笑することができます。 ITimeServiceの "本当の" 実装がただDateTime.Nowを返します

public class MyClass 
{ 
    private readonly ITimeService _timeService; 

    public MyClass(ITimeService timeService) 
    { 
     _timeService = timeService; 
    } 

    public int GetCurrentYear() 
    { 
     return _timeService.Now.Year; 
    } 
} 

public interface ITimeService 
{ 
    DateTime Now { get; } 
} 

代わりにコード内で直接DateTime.Nowを使用しての、ITimeServiceのインスタンスを注入:このような何か。あなたの単体テストでは、どんなモッキングフレームワーク(FakeItEasy、Moq、NS substitute ...)でもあなたがコントロールするモックタイムサービスを作ることができます。例えば、FakeItEasyを使用して:彼らは独断回答やスパムを誘致する傾向があるよう

// Arrange 
var timeService = A.Fake<ITimeService>(); 
A.CallTo(() => timeService.Now).Returns(new DateTime(1969, 7, 21)); 
var myClass = new MyClass(timeService); 

// Act 
var year = myClass.GetCurrentYear(); 

// Assert 
year.Should().Be(1969); 
+0

インタフェースを追加する必要があるので、ソースコードの変更が必要ですか? –

+0

@AdamLee依存性注入をすでに使用しているのであれば、それほど大きな変更ではありません。とにかく、 'DateTime.Now'を嘲笑するには、私が言及した高価なツールを買うのに足りないコード変更が必要です。別の方法として、静的な読み書き可能な 'TimeService.Now'プロパティを使用する方法があります。これは、コードの変更が少ないことを意味しますが、グローバルな状態を導入するため、あまりクリーンではありません。テストを並行して実行することはできません。 –

関連する問題