Sdílet prostřednictvím


Izolace testovaného kódu pomocí zástupného rozhraní Microsoft

Fakes Microsoft nápovědy izolovat kód testujete nahrazením ostatních částí aplikace s kódy nebo Překryvné ovladače.Jedná se o malé množství kódu, které jsou pod kontrolou testy.Izolováním kódu pro testování víte, že jestliže se test nezdaří, příčinou je pak a někde jinde.Kódy a Překryvné ovladače také umožňují otestování vašeho kódu, i v případě, že nejsou ještě práci ostatních částí aplikace.

Předstírá přicházejí dva typy:

  • A se zakázaným inzerováním nahradí třídu malé náhrada, která implementuje stejné rozhraní.Chcete-li použít kódy, máte Navrhněte aplikaci tak, aby každá komponenta závisí pouze na rozhraních a nikoli na jiné komponenty.("Součásti" jsme střední třídy nebo skupiny tříd, které jsou vytvořeny a aktualizovány společně a obvykle obsažených v sestavení.)

  • A překrytí upravuje zkompilovaný kód aplikace za běhu, tak, že namísto volání zadanou metodu překrytí kód, který poskytuje test.Překryvné ovladače lze použít k nahrazení volání sestavení, které nelze upravit, takové sestavení .NET.

Předstírá nahradit jinými součástmi

Požadavky

  • Visual Studio Ultimate

Volba mezi typy se zakázaným inzerováním a překrytí

Obvykle by měli projekt aplikace Visual Studio jako komponentu, protože vytvářet a aktualizovat tyto třídy ve stejnou dobu.By měli používat kódy a Překryvné ovladače pro volání, které projekt provádí další projekty v řešení nebo jiné sestavení, která odkazuje na projekt.

Jako obecné vodítko použijte prázdný kód pro volání v rámci řešení aplikace Visual Studio a Překryvné ovladače pro volání do ostatních odkazovaných sestaveních.Je to proto, že v rámci své vlastní řešení je vhodné oddělit součásti definováním rozhraní ve způsobu, jakým stubbing vyžaduje.Ale externí sestavení, jako například System.dll obvykle nemají oddělené rozhraní definicemi, místo toho je nutné použít Překryvné ovladače.

Další aspekty jsou:

Výkon. Překryvné ovladače pracovat pomaleji, protože jejich přepište kód za běhu.Kódy nemají nároky na výkon a jsou tak rychlé, můžete tuto stránku virtuální metody.

Statické metody uzavřených typů. Kódy můžete použít pouze k implementaci rozhraní.Proto se zakázaným inzerováním typy nelze používat statické metody, -virtuální metody, uzavřených virtuální metody, metody v uzavřených typy a tak dále.

Vnitřní typy. Kódy a Překryvné ovladače lze použít s vnitřní typy, které jsou zpřístupněny pomocí atributu sestavení InternalsVisibleToAttribute.

Soukromé metody. Překryvné ovladače mohou nahradit volání soukromé metody, pokud jsou zobrazeny všechny typy na podpis metody.Kódy můžete nahradit pouze viditelné metody.

Rozhraní a abstraktní metody. Kódy poskytují implementaci rozhraní a abstraktní metody, které lze použít při testování.Překryvné ovladače nelze nástroje rozhraní a abstraktní metody, protože nemají základní text metody.

Obecně doporučujeme používat typy se zakázaným inzerováním izolovat od závislosti v rámci vaší codebase.To lze provést skrytí komponenty za rozhraní.Typy překrytí lze izolovat z komponenty třetích stran, které neposkytují lze rozhraní API.

Začínáme s kódy

  1. Vstříkněte rozhraní

    Chcete-li použít kódy, musíte napsat kód, že chcete vyzkoušet tak, že to není výslovně třídy v jiné součásti aplikace."Součástí" jsme střední třídy nebo tříd, které jsou vyvíjeny a aktualizovány společně a v typickém případě obsaženy v jednom projektu sady Visual Studio.Proměnné a parametry by měly být deklarovány pomocí rozhraní a instancí jiné součásti by měly být předány v nebo vytvořené pomocí továrny.Například je-li StockFeed třídy v jiné součásti aplikace, pak to bude považováno za chybné:

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

    Místo toho definujte rozhraní, mohou být implementovány na součást a které mohou být implementovány také pomocí se zakázaným inzerováním pro testovací účely:

    public int GetContosoPrice(IStockFeed feed)
    { return feed.GetSharePrice("COOO"); }
    
    Public Function GetContosoPrice(feed As IStockFeed) As Integer
     Return feed.GetSharePrice("COOO")
    End Function
    
  2. Přidání sestavení předstírá

    1. V Průzkumníku řešení rozbalte seznam odkazů projekt testů.Pokud pracujete v jazyce Visual Basic, musíte zvolit Zobrazit všechny soubory Chcete-li zobrazit seznam odkazů.

    2. Vyberte odkaz na sestavení, ve kterém je definováno rozhraní (například IStockFeed).V místní nabídce tento odkaz, vyberte Přidat sestavení Fakes.

    3. Znovu sestavit řešení.

  3. Při zkouškách konstrukci instancí zakázaným inzerováním a stanovit pravidla pro jeho kód:

    [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
    

    Zvláštní část zde kouzelná je třída StubIStockFeed.Pro každé rozhraní v odkazovaném sestavení generuje mechanismus Microsoft Fakes třída se zakázaným inzerováním.Název třídy se zakázaným inzerováním je odvozená od názvu rozhraní, s "Fakes.Stub" jako předponu a názvy parametrů typu připojeny.

    Kódy jsou také generovány pro mechanismy získání a nastavení vlastností, událostí a obecné metody.Další informace naleznete v tématu Vzájemná izolace částí aplikace pomocí zástupných procedury za účelem testování částí.

Začínáme s Překryvné ovladače

Předpokládejme, že vaše komponenta obsahuje volání DateTime.Now:

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

Během testování, které byste chtěli shim Now vlastnost, protože skutečné verze inconveniently vrací různé hodnoty při každém volání.

Chcete-li použít Překryvné ovladače, není nutné změnit kód aplikace nebo napíšete konkrétní způsob.

  1. Přidání sestavení předstírá

    V okně Průzkumník řešení otevřete váš projekt testů jednotky odkazy a vyberte odkaz na sestavení, které obsahuje metodu, kterou chcete falešné.V tomto příkladu DateTime třída je v System.dll.Chcete-li zobrazit odkazy v projektu jazyka Visual Basic, zvolte Zobrazit všechny soubory.

    Zvolte přidejte sestavení předstírá.

  2. Doplňkový kód vložte 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
    

    Názvy tříd překrytí se skládají pomocí prefixu Fakes.Shim k původnímu názvu typu.Názvy parametrů jsou připojena k názvu metody.

Předchozí příklad používá doplňkový kód pro statické metody.Chcete-li použít doplňkový kód pro metodu instance, napište AllInstances mezi název typ a název metody:

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

Můžete také vytvořit Překryvné ovladače pro konkrétní instance, konstruktory a vlastnosti.Další informace naleznete v tématu Izolace aplikace od ostatních sestavení pomocí překrytí za účelem testování částí.

V této části

Vzájemná izolace částí aplikace pomocí zástupných procedury za účelem testování částí

Izolace aplikace od ostatních sestavení pomocí překrytí za účelem testování částí

Generování kódu, kompilaci a konvence v Microsoft předstírá