Udostępnij za pośrednictwem


Izolowanie testowanego kodu za pomocą struktury Microsoft Fakes

Pomoc Microsoft Fakes wyizolować kod testowany przez zastąpienie innych częściach aplikacji wraz z procedur wejścia lub podkładek.Są to małe kawałki kodu, które są pod kontrolą testów.Izolując kodu do testowania, wiadomo, że test zakończy się niepomyślnie, przyczyną jest tam i gdzie indziej.Procedur wejścia i podkładki umożliwiają również przetestować kod, nawet jeśli nie działają jeszcze innych częściach aplikacji.

Podrobionych występują w dwóch wersjach:

  • A skrótowych klasy są zastępowane substytut małych, która implementuje ten interfejs.Aby użyć procedur wejścia, należy projektować aplikację tak, aby każdy składnik zależy tylko na interfejsach, a nie na inne składniki.(Przez "składnik" rozumiemy klasy lub grupy klas, które są zaprojektowane i aktualizowane jednocześnie i zazwyczaj zawarty w zestawie.)

  • A podkładka modyfikuje skompilowany kod aplikacji w czasie wykonywania, tak aby zamiast transmisją określona metoda uruchamiania kod poprawka zgodności aplikacji, która zapewnia taki test.Podkładki może być użyty do zastąpienia wywołania zestawy, do których nie można modyfikować takich zestawów .NET.

Podrobionych zastąpić innych składników

Wymagania

  • Visual Studio Ultimate

Wybieranie między typów skrótowych i poprawka zgodności aplikacji

Zazwyczaj rozważy projekt programu Visual Studio do składnika, ponieważ użytkownik rozwijania i aktualizowania tych klas w tym samym czasie.Uważam, za pomocą procedur wejścia i podkładki dla wywołań, które projekt sprawia, że do innych projektów w rozwiązaniu lub inne zestawy, do których odwołuje się do projektu.

Jako ogólne wskazówki należy użyć procedur wejścia dla wywołań w ramach rozwiązania Visual Studio i podkładki dla wywołań do innych zestawów, do którego istnieje odwołanie.Dlatego w ramach własnego rozwiązania jest dobrą praktyką oddzielenie składników, definiując interfejsów w sposób, że karczowarki.Ale zewnętrznych zespołów, takich jak System.dll zazwyczaj nie są dostarczane z definicjami oddzielny interfejs podkładki trzeba używać zamiast.

Inne uwagi są:

Wydajność. Podkładki działają wolniej, ponieważ one przepisać kod w czasie wykonywania.Procedur wejścia nie mają tego obciążenie i tak szybko, jak można go w metodach wirtualnych.

Metody statyczne, w plombowane typów. Kategoria: umożliwia jedynie implementować interfejsów.W związku z tym typy stub nie można użyć dla metody statyczne, metody wirtualne, zamkniętych metody wirtualne, metody w zapieczętowanych typów i tak dalej.

Rodzaje wewnętrznych. Procedur wejścia i podkładki służy wewnętrznych typów, które są dostępne przy użyciu atrybut assembly InternalsVisibleToAttribute.

Prywatnych metod. Podkładki można zastąpić wywołania metod prywatnych, jeśli wszystkie typy na podpis metody jest widoczna.Kategoria: tylko można zastąpić metody widoczne.

Interfejsy i metody abstrakcyjne. Kategoria: dostarcza implementacji interfejsów i metody abstrakcyjne, które mogą służyć do testowania.Podkładki nie może instrumentu, interfejsy i metody abstrakcyjne, ponieważ nie zawierają treść metody.

Ogólnie rzecz biorąc zaleca się, aby używać skrótowej typy izolować od zależności w ramach swojej codebase.Można to zrobić przez ukrycie elementów za interfejsów.Typy poprawka zgodności aplikacji można izolować od innej części, które nie posiadają sprawdzalne interfejsu API.

Rozpoczynanie pracy z fragmentami

  1. Wprowadzić strzykawką interfejsów

    Aby korzystać z procedur wejścia, musisz napisać kod, testowanych w taki sposób, że go nie stwierdziło klas w innym składniku aplikacji."Składnik" oznacza klasę lub klasy, które są opracowane i aktualizowane jednocześnie i znajdują się w jednym projekcie programu Visual Studio.Zmienne i parametry powinny zostać uznane za za pomocą interfejsów i wystąpienia innych składników powinny zostać przekazany lub utworzone za pomocą fabrykę.Na przykład jeśli StockFeed jest klasą w innym składniku aplikacji, a następnie to będzie za negatywne:

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

    Zamiast tego zdefiniować interfejsem, które mogą być wdrażane przez inny składnik, a która także może być implementowana przez stub dla celów testowych:

    public int GetContosoPrice(IStockFeed feed)
    { return feed.GetSharePrice("COOO"); }
    
    Public Function GetContosoPrice(feed As IStockFeed) As Integer
     Return feed.GetSharePrice("COOO")
    End Function
    
  2. Dodawanie zestawu podrobionych

    1. W oknie Solution Explorer należy rozwinąć listę odwołania projektu testowego.Jeśli pracujesz w języku Visual Basic, należy wybrać, Pokaż wszystkie pliki w celu zapoznaj się z listą odwołania.

    2. Wybierz opcję odwołanie do zestawu, w którym zdefiniowano interfejsu (na przykład IStockFeed).W menu skrótów tego odwołania, wybierz polecenie Dodać sfałszować zestawu.

    3. Odbudowanie rozwiązanie.

  3. W testów należy utworzyć wystąpienia procedura wejścia i podaj kod dla metody jego:

    [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
    

    Specjalne kawałek Magiczna w tym miejscu jest klasa StubIStockFeed.Dla każdego interfejsu w odnośny zestaw mechanizm Fakes Microsoft generuje Klasa zastępcza.Nazwa klasy skrótowej jest pochodna od nazwy interfejsu, z "Fakes.Stub" jako prefiks i nazwy typu parametrów, które są dołączone.

    Są również wygenerowany dla pobierające i ustawiające metody, właściwości, zdarzenia i metody rodzajowe.Aby uzyskać więcej informacji, zobacz Stosowanie wycinków kodu do izolowania od siebie poszczególnych części aplikacji w celu przeprowadzania testów jednostkowych.

Wprowadzenie do podkładek

Załóżmy, że składnik zawiera wywołań DateTime.Now:

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

Podczas badania, które chcesz podkładki Now właściwość, ponieważ prawdziwą wersję niekorzystnie zwraca inną wartość w każdym wywołaniu.

Aby używać podkładki, nie trzeba modyfikować kodu aplikacji lub zapisz je w określony sposób.

  1. Dodawanie zestawu podrobionych

    W oknie Solution Explorer otwórz projekt testu jednostki odniesienia i zaznacz odwołanie do zestawu, który zawiera odpowiednią do fałszywych metodę.W tym przykładzie DateTime klasa znajduje się w System.dll.Jakie są adresy w projekcie języka Visual Basic, należy wybrać Pokaż wszystkie pliki.

    Wybierz polecenie dodać zestaw podrobionych.

  2. Wstaw podkładka w 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
    

    Nazwy klas podkładka składają się dodając Fakes.Shim do oryginalnej nazwy typu.Nazwy parametrów są dołączane do nazwy metody.

W poprzednim przykładzie użyto podkładka dla metody statycznej.Aby użyć podkładka metody instancji, napisz AllInstances między nazwą typ i nazwa metody:

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

Można również utworzyć podkładki, w przypadku wystąpień, konstruktorów i właściwości.Aby uzyskać więcej informacji, zobacz Stosowanie podkładek do izolowania aplikacji od innych zestawów w celu przeprowadzania testów jednostkowych.

W tej sekcji

Stosowanie wycinków kodu do izolowania od siebie poszczególnych części aplikacji w celu przeprowadzania testów jednostkowych

Stosowanie podkładek do izolowania aplikacji od innych zestawów w celu przeprowadzania testów jednostkowych

Generowanie kodu, kompilacji i konwencje nazewnictwa towarami podrobionymi Microsoft