.NETモッキングフレームワークとそれらの動作に関する私のブログシリーズの仲間として、このリポジトリは、.NETで利用可能な各主要なモッキングフレームワークを使用してモックで同じユニットテストを実装しようとします。
このプロジェクトは、.NETモッキングフレームワークを比較しようとしている人や、特定のフレームワークの構文の例を参照しようとしている人のリファレンスとなることを目的としています。それは徹底的なリファレンスであることを意図したものではなく、バグフリーであることはガウランティードではありません(ただし、問題が見つかった場合はお知らせください)。
テストを作成するには、テストが必要なコードが必要です。したがって、私はLunchNotifierを作成しました。これは、(模擬付き)単位テストを書くことができる、ヘロワードよりもわずかに何度ものクラスを作成しました。
ニューヨークオフィスで働いているOverflow Emplpoyeesに提供される利点の1つは、社内シェフからの無料ランチです。料理人が食事の準備を完了したとき、毎日、オフィスの従業員に通知が出て、食べ物が利用可能であることを知らせます。
CodeBeingTestedプロジェクトでは、 LunchNotifierクラスが主なターゲットです。
このクラスには、テストを実行するためにock笑する必要がある5つの外部依存症があります。
INotificationService (コンストラクターを介して注入)ILogger (コンストラクター経由で注入)IEmployeeService (コンストラクターを介して注入)IEmployeeオブジェクトとして)のリストを取得するために使用されますIEmployee ( IEmployeeServiceから返送)System.DateTime主なロジックはLunchNotifier.SendLunchtimeNotifications()にあります。この方法には、 System.DateTime.Nowへのインライン呼び出しが含まれます。
public void SendLunchtimeNotifications()
{
var now = DateTime.Now;
var templateToUse = now.Hour > 12 ? LateLunchTemplate : RegularLunchTemplate;
LunchNotifier.SendLunchtimeNotifications_DateTimeSeam()で、Countained Framesによって使用するための代替実装が提供されます。ここでは、 DateTime.Nowの呼び出しが独自の方法に抽出されています。
public virtual DateTime GetDateTime() => DateTime.Now;
public void SendLunchtimeNotifications_DateTimeSeam()
{
var now = GetDateTime();
var templateToUse = now.Hour > 12 ? LateLunchTemplate : RegularLunchTemplate;
残りの各プロジェクトは、さまざまなモッキングフレームワークを使用して、 LunchNotifierに対して同様のユニットテストセットを実装しようとします。
すべてのテストは、Nugetパッケージを使用してNunit V3.10を使用して記述されます。
場合によっては、モッキングフレームワークを使用してテストにアプローチする複数の方法があるため、さまざまなアプローチを紹介するためにテストの複数のバリエーションを提供しました。
このテストでは、電子メール通知を好み、モックを使用してLunchNotifierロジックが昼食の準備ができたらメールを送信することを確認する模擬従業員「ボブ」が作成されます。
このテストでは、2人の模擬従業員「ボブ」と「マーサ」が作成され、そのうちの1人に通知を送信すると、エラーが記録され、残りの従業員が通知を受けないようにします。
このテストでは、NunitのTestCase構文を使用して、1つは午後1時前と午後1時以降に1つは2つのテストケースを実行して、時刻に基づいて適切な通知テンプレートが使用されるようにします。
制約のないフレームワークの場合、 DateTime.Nowを直接制御してテストの入力時間を返すことができますが、制約されたフレームワークはできません。そのため、 DateTime.Nowへの呼び出しを抽出し、smperateメソッドに抽出し、代わりに新しい方法の動作を変更する必要があります。したがって、 SendLunchtimeNotifications_DateTimeSeamバリアントの必要性。
タイプ:制約
プロジェクト:https://github.com/moq/moq4/wiki/quickstart
nuget:https://www.nuget.org/packages/moq/
タイプ:制約
プロジェクト:https://github.com/hibernating-rhinos/rhino-mocks
nuget:https://www.nuget.org/packages/rhinomocks
警告: Rhinomocksは事実上死んだプロジェクトであり、.NET Coreなどの.NETの将来の変更をサポートしない可能性があります。まだ使用していない場合は、このフレームワークを使用し始めることをお勧めしません。
これらのテストを実行するには、VS2017 Enterprise(またはequiv)をインストールする必要があります。
タイプ:制約
プロジェクト:http://nsubstitute.github.io/
nuget:https://www.nuget.org/packages/nsubstitute
タイプ:制約なし
Microsoft Fakesは、Visual Studio 2017 EnterpriseまたはVisual Studio 2015 Ultimateの一部として提供されており、Smperateコンポーネントとしては利用できません。
FakesはAssertWasCalled Style Validationをネイティブにサポートしていないため、追加のNugetパッケージ(貢献しました)を利用して、その機能を提供します:fakes.contrib / nuget
タイプ:制約なし
製品情報:https://www.typemock.com/isolator
この製品には、制約のないモッキングを行うには、有料ライセンスが必要です(15日間の無料トライアルがあります)。 Typemockは、このようなプロジェクトに取り組むことができるように、無料のコミュニティライセンスを提供するのに十分で良かったです。