共用方式為


使用 Microsoft Fakes 在測試期間隔離程式碼

Microsoft Fakes 幫助您找出您透過取代應用程式的其他部分測試與 Stub 或 填充碼的程式碼。 這是受測試的控制項小程式碼部分。 藉由隔離測試的程式碼,您知道,如果測試失敗,原因 (而非其他地方。 Stub 和填充碼也可讓您測試程式碼,即使您的應用程式的其他部分無法運作。

Fakes 分為兩個功能:

  • Stub 會實作相同介面的小型替代取代類別。 若要使用 Stub,您必須設計應用程式,讓每個元件只取決於介面,而其他元件。 (由「元件為我們表示以及通常會和更新類別的類別或群組包含組件中)。

  • Shim 修改應用程式編譯的程式碼在執行階段,以便而不是呼叫指定的方法呼叫,並執行您的測試提供的 Shim 程式碼。 Shim 可以用來取代呼叫您無法修改的組件,這樣的 .NET 組件。

Fakes 會取代其他元件

需求

  • Visual Studio Ultimate

在 Stub 和 Shim 型別之間做選擇。

通常,,因為您同時,開發並更新這些類別應考量的 Visual Studio 專案是元件。 您應該考慮使用 Stub 和填充碼呼叫的專案對其他專案在方案中,或是專案參考的其他組件。

為一般方針,在您的 Visual Studio 方案中使用 Stub 和填充碼呼叫到其他參考的組件。 這是因為,在您的方案內是很好的作法藉由定義介面分隔元件就像 Stub 要求的。 但是,外部組件 (例如 System.dll 通常不提供不同的介面定義,因此,您必須使用填充碼。

其他考量如下:

效能因為它們重寫程式碼在執行階段,填充碼執行速度變慢。 Stub 沒有這個效能負荷且相同快速地是,與虛擬方法可以是。

靜態方法,密封型別。 您只能使用 Stub 實作介面。 因此,Stub 型別不能是靜態方法,非虛擬方法,密封虛擬方法,在密封型別所採用的方法,依此類推。

**內部型別。**Stub 和 Shim 可以搭配使存取使用組件屬性 InternalsVisibleToAttribute的內部型別。

私用方法如果方法簽章的所有型別都是可見的, Shim 可以取代呼叫私用方法。 Stub 只能取代可見的方法。

介面和抽象方法。 Stub 提供可用來測試介面和抽象方法的實作。 因為它們沒有方法主體, Shim 無法檢測介面和抽象方法。

一般而言,我們建議您使用將 Stub 型別與您的程式碼基底內的相依性所隔離。 您可以藉由隱藏在介面之後的元件這麼做。 Shim 型別可以與不提供可測試的 API 的協力廠商元件隔離。

開始使用 Stub

  1. 插入介面

    若要使用 Stub,您必須將您要測試的程式碼,在此情況下不明確提到在應用程式中其他元件的類別。 由「元件為我們表示類別或類別一起開發並更新和在 Visual Studio 專案通常包含了。 應該宣告變數和參數使用介面使用 Factory,因此,應該將或建立其他元件執行個體。 例如,如果 StockFeed,是在應用程式的另一個元件的類別,然後就會視為不當的:

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

    相反地,請定義可由另一個元件實作,因此,可以由 Stub 負責進行測試所實作的介面:

    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. 在您的測試,請建構執行個體 Stub 並為其方法的程式碼:

    [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 偽造機制產生 Stub 類別。 Stub 類別的名稱是衍生自介面的名稱,與「Fakes.Stub」做為前置詞和參數型別的名稱。

    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

    [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 組成。 參數名稱附加至方法名稱。

上述範例為靜態方法使用一個填充碼。 為執行個體方法要使用填充碼,撰寫在型別名稱和方法名稱之間的 AllInstances :

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

您也可以建立 Shim 特定執行個體的,建構函式的和屬性的。 如需詳細資訊,請參閱使用填充碼將應用程式與其他組件隔離,方便進行單元測試

本節內容

使用虛設常式隔離應用程式的各個組件,方便進行單元測試

使用填充碼將應用程式與其他組件隔離,方便進行單元測試

Microsoft Fakes 中的程式碼產生、編譯和命名慣例