次の方法で共有


Microsoft Fakes を使用したテストでのコードの分離

Microsoft の偽造項目は、スタブ または shimによってアプリケーションの他の部分を置き換えることで、テストするコードを分離できます。これらのテストの制御下にある小さなコードです。テストのコードを分離することによって、テストが失敗した原因は、そこで、どの場所にあることを確認できます。アプリケーションの他の部分がまだ働かなくてもスタブと shim は、コードをテストすることもできます。

偽造項目は 2 種類のフレーバーなっています:

  • スタブ は、同じインターフェイスを実装する小さな代用とクラスを置き換えます。各コンポーネントのインターフェイスだけによって決まるために、スタブを使用するには、他のコンポーネントでアプリケーションを設計します。コンポーネント ( "" では、デザインされ、共に更新され、通常はアセンブリに含まれているクラスまたはクラスのグループを意味します。

  • shim は、実行時に指定メソッドではなく、テストを提供する shim コードを実行するように、アプリケーションのコンパイル済みコードを変更します。Shim は変更できない、.NET アセンブリのサテライト アセンブリの呼び出しの置換に使用できます。

他のコンポーネントに置き換わる Fakes

要件

  • Visual Studio Ultimate

スタブと shim の型の間の選択

通常、これらのクラスを同時に作成および更新するため、コンポーネントには、Visual Studio のプロジェクトがあるとします。プロジェクトがソリューション内の他のプロジェクトにする、またはそのほかのプロジェクトのアセンブリ参照を考慮することにスタブと shim を使用して呼び出しの。

一般的な方法として、Visual Studio ソリューション内ではに対してスタブを使用すると、他の呼び出しのシムはアセンブリを参照しました。これにより、独自のソリューション内では、ぶつかることが必要な方法でインターフェイスを定義することにより、コンポーネントを分離する推奨される方法であるためです。ただし、System.dll などの外部アセンブリが別のインターフェイス定義を通常は付与されず、shim を代わりに使用する必要があります。

そのほかの考慮事項は次のとおりです:

パフォーマンスユーザーが実行時にコードを記述するので遅く実装にくさびを入力します。仮想メソッドが移動できるほどスタブにこのパフォーマンス オーバーヘッドがなく、高速に処理されます。

**静的メソッド、シールされた型。**インターフェイスを実装する場合にのみスタブを使用できます。したがって、スタブは静的メソッド、型、仮想メソッド、シールされた仮想メソッド、シールされた型のメソッドによって使用できません。

**内部型。**スタブと shim の両方がアセンブリの属性 InternalsVisibleToAttributeを使用してアクセスできる型の内部で使用できます。

プライベート メソッドShim は、プライベート、メソッド シグネチャのすべての型を表示する場合はを置き換えることができます。スタブが表示されるメソッドに置き換えることができます。

**インターフェイスおよび抽象メソッド。**スタブは、インターフェイスおよびテストで使用できる抽象メソッドの実装を提供します。Shim は、メソッド本体がないため、インターフェイスおよび抽象メソッドをインストルメント化することはできません。

一般に、は、のコードベース内の依存関係から分離するためにスタブの型を使用することをお勧めします。インターフェイスの分離コンポーネントを非表示にすることによってこれを行うことができます。検証可能な API を提供しないサードパーティのコンポーネントから分離するために Shim の型を使用できます。

スタブとの開始

  1. インターフェイスを挿入します。

    スタブを使用するには、明示的にアプリケーションの別のコンポーネント クラスを述べないように、テストするコードを記述する必要があります。コンポーネントによって ""、および 1 の Visual Studio プロジェクトに含まれる通常、一緒に開発され、更新された、クラスを意味します。変数とパラメーターは、インターフェイスを使用して宣言され、他のコンポーネントのインスタンスは成功またはファクトリを使用して作成する必要があります。たとえば StockFeed がアプリケーションの別のコンポーネントのクラス、つまり無効な状態として解釈されます。:

    return (new StockFeed()).GetSharePrice("COOO"); // Bad

    代わりに、実行できる他のコンポーネントによって、スタブによってテストの目的で実装されるインターフェイスを定義する:

    public int GetContosoPrice(IStockFeed feed)
    { return feed.GetSharePrice("COOO"); }
    
    Public Function GetContosoPrice(feed As IStockFeed) As Integer
     Return feed.GetSharePrice("COOO")
    End Function
    
  2. [Fakes アセンブリに追加]

    1. ソリューション エクスプローラーで、テスト プロジェクトの参照一覧を展開します。Visual Basic で作業している場合、参照一覧を表示するには [すべてのファイルを表示] を選択する必要があります。

    2. インターフェイス (たとえば) IStockFeed が定義されているアセンブリへの参照を選択します。この参照のショートカット メニューで、[Fakes アセンブリに追加] を選択します。

    3. ソリューションをビルドし直します。

  3. テストでは、のインスタンスを構築し、スタブ メソッドのコードを提供する:

    [TestClass]
    class TestStockAnalyzer
    {
        [TestMethod]
        public void TestContosoStockPrice()
        {
          // Arrange:
    
            // Create the fake stockFeed:
            IStockFeed stockFeed = 
                 new StockAnalysis.Fakes.StubIStockFeed() // Generated by Fakes.
                     {
                         // Define each method:
                         // Name is original name + parameter types:
                         GetSharePriceString = (company) => { return 1234; }
                     };
    
            // In the completed application, stockFeed would be a real one:
            var componentUnderTest = new StockAnalyzer(stockFeed);
    
          // Act:
            int actualValue = componentUnderTest.GetContosoPrice();
    
          // Assert:
            Assert.AreEqual(1234, actualValue);
        }
        ...
    }
    
    <TestClass()> _
    Class TestStockAnalyzer
    
        <TestMethod()> _
        Public Sub TestContosoStockPrice()
            ' Arrange:
            ' Create the fake stockFeed:
            Dim stockFeed As New StockAnalysis.Fakes.StubIStockFeed
            With stockFeed
                .GetSharePriceString = Function(company)
                                           Return 1234
                                       End Function
            End With
            ' In the completed application, stockFeed would be a real one:
            Dim componentUnderTest As New StockAnalyzer(stockFeed)
            ' Act:
            Dim actualValue As Integer = componentUnderTest.GetContosoPrice
            ' Assert:
            Assert.AreEqual(1234, actualValue)
        End Sub
    End Class
    

    ここでマジックの特殊な部分は、クラス StubIStockFeedです。参照アセンブリの任意のインターフェイスは、Microsoft の偽造項目の機構はスタブ クラスを生成します。スタブ クラス名はプレフィックスとして "" Fakes.Stubのインターフェイス名から派生する追加されて、パラメーターの型名です。

    スタブは、プロパティの getter および setter、イベント、およびジェネリック メソッドに対して作成されます。詳細については、「スタブを使用して単体テストでアプリケーションの各部分を相互に分離する」を参照してください。

shim によって開始

コンポーネントが DateTime.Nowの呼び出しが含まれていることを想定しています:

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

テストの実行中に、実際のバージョンが、では不便に別の値を返すため Now のプロパティにくさびを入力することも必要になります。

shim を使用するには、アプリケーション コードを変更するか、それに特定の方法を記述する必要はありません。

  1. [Fakes アセンブリに追加]

    ソリューション エクスプローラーで、単体テスト プロジェクトの参照を開き、偽造するメソッドを含むアセンブリへの参照を選択します。この例では、DateTime のクラスは System.dllにあります。確認するには、Visual Basic の参照は、プロジェクト [すべてのファイルを表示] を選択します。

    [Fakes アセンブリに追加] を選択します。

  2. ShimsContext の shim を挿入します。

    [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);
                }
            }
    }
    
    <TestClass()> _
    Public Class TestClass1
        <TestMethod()> _
        Public Sub TestCurrentYear()
            Using s = Microsoft.QualityTools.Testing.Fakes.ShimsContext.Create()
                Dim fixedYear As Integer = 2000
                ' Arrange:
                ' Detour DateTime.Now to return a fixed date:
                System.Fakes.ShimDateTime.NowGet = _
                    Function() As DateTime
                        Return New DateTime(fixedYear, 1, 1)
                    End Function
    
                ' Instantiate the component under test:
                Dim componentUnderTest = New MyComponent()
                ' Act:
                Dim year As Integer = componentUnderTest.GetTheCurrentYear
                ' Assert: 
                ' This will always be true if the component is working:
                Assert.AreEqual(fixedYear, year)
            End Using
        End Sub
    End Class
    

    Shim のクラス名は元の型名に Fakes.Shim の前に付けることによって構成されます。パラメーター名は、メソッドの名前に追加されます。

前の例では静的メソッドの場合、shim を使用します。インスタンス メソッドの場合、shim を使用するには、型名とメソッド名の間に AllInstances を記述します:

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

また、特定のインスタンス コンストラクター、およびの各プロパティの shim を作成できます。詳細については、「shim を使用して単体テストでアプリケーションを他のアセンブリから分離する」を参照してください。

このセクションの内容

スタブを使用して単体テストでアプリケーションの各部分を相互に分離する

shim を使用して単体テストでアプリケーションを他のアセンブリから分離する

Microsoft Fakes におけるコード生成、コンパイル、および名前付け規則