Microsoft Fakes(Shims)を使用したテスト中のコードの分離

初めてJavaのユニットテストに出会い、最終クラス、静的メンバーでmokiを実行できることを嬉しく思いました。 現時点では、.Netではこのようなことはできません。 インターフェイスのみ。 不自然なことをする必要がある場合は、実装を書き直し、IOCなどを行う必要があることを、無制限に話すことができます。 しかし、単体テストにアーキテクチャ的に適していない継承コードに関しては、書き換えることなく物事を変更できることが役立ちます。

私はついにJavaを放棄し、.Netに入りました。ユニットテストについて話すたびに、Javaにはもっと多くの可能性があることを思い出しました。

そして2012年、スタジオはあらゆるオブジェクトのモックを作成する機能を追加しました。 絶対に、さらにはシステム。 カットの下にあるのは、MSDNの記事の翻訳です(スタブは特に重要ではないため、shimによってのみ翻訳されます)。



マイクロソフトでは「シム」という用語を使用していますが、翻訳しようとはしませんが、シムです。



シムとは

Microsoft Fakesは、シムとスタブの2つの方法でテスト済みコードを分離するのに役立ちます。

シムは、実行時にコンパイルされたコードを変更するため、メソッド呼び出しは、作成したコードの呼び出しに置き換えられます。 Shimは、.Net Frameworkアセンブリなど、制御できないアセンブリ呼び出しを置き換えるために使用できます。

画像



スタブとシムの選択

通常、VSのプロジェクトは個別のコンポーネントとして開発され、ソリューション内の他のプロジェクトまたはプロジェクトが参照する外部アセンブリの使用済みオブジェクトにスタブまたはシムを使用したいという要望があります。

ソリューション内のコードにはスタブを、外部アセンブリにはシムを使用してみてください。 インターフェイスを強調表示して要素を分解することをお勧めします。これにより、スタブを使用できますが、System.dllなどの外部アセンブリには通常この分解がないため、シムを使用する必要があります。



使用する

コンポーネントにDateTime.Now呼び出しがあると想像してください:

// Code under test: public int GetTheCurrentYear() { return DateTime.Now.Year; }
      
      





テスト中に、Nowプロパティpwmを作成します。 オリジナルは常に異なる値を返します

シムを使用するために、コードを変更したり、特定の方法で記述したりする必要はありません。



1.偽造ビルドの追加

ソリューションエクスプローラーで、プロジェクトの参照を開き、置換するクラスを含むアセンブリを選択します。 DateTimeクラスはSystem.dllアセンブリにあります。 コンテキストメニューから「フェイクアセンブリを追加」を選択します。



2. ShimsContext内でシムを使用する

  [TestClass] public class TestClass1 { [TestMethod] public void TestCurrentYear() { int fixedYear = 2000; // Shims can be used only in a ShimsContext: using (ShimsContext.Create()) { // Arrange: // Shim DateTime.Now to return a fixed date: System.Fakes.ShimDateTime.NowGet = () => { return new DateTime(fixedYear, 1, 1); }; // Instantiate the component under test: var componentUnderTest = new MyComponent(); // Act: int year = componentUnderTest.GetTheCurrentYear(); // Assert: // This will always be true if the component is working: Assert.AreEqual(fixedYear, year); } } }
      
      





Shimクラス名は、元の名前に追加されたFakes.Shimプレフィックスで始まります。

この例では、静的メソッドにシムが使用され、非静的メソッドにシムを使用するには、型名とメソッド名の間にAllInstancesを追加します。

 System.IO.Fakes.ShimFile.AllInstances.ReadToEnd = ...
      
      





シムは、特定のオブジェクト、デザイナー、プロパティ用に作成することもできます。



この翻訳が人々にとって興味深いものであることが判明した場合は、すべてのケースでシムを使用する例を提供する次の記事を翻訳します。



All Articles