Поделиться через


Изоляция тестируемого кода с помощью Microsoft Fakes

Справка по Microsoft Fakes, чтобы изолировать код выполнении, заменив другие части приложения с заглушками или оболочками.Эти мелкие части кода, под элементом управления тестов., Изолируя код для тестирования, известно, что при неудачном завершении, причина существуют и не в другом месте.Заглушки и оболочки также позволяют выполнять код, даже если другие части приложения не работают при.

Фальшивки только в версии 2:

  • заглушка заменяет класс с небольшим заменителем, реализующий один и тот же интерфейс.Для использования заглушек необходимо разработать приложение так, чтобы каждый компонент будет зависеть только от интерфейсах, а не с другими компонентами.("Компонентом" связанного значим класс или группу в составе классы, созданные и обновляются вместе и обычно содержатся в сборке).

  • оболочка изменяет компилировать код приложения во время выполнения, чтобы вместо создания данного метода, он выполняется код оболочки, тест предоставляет.Оболочки можно использовать, чтобы заменить вызовы сборки, нельзя изменять, тем сборки .NET.

Имитации замещают другие компоненты

Требования

  • Visual Studio Ultimate

Выбор между заглушкой и оберткой.

Обычно стали бы проекта Visual Studio быть компонентом, потому что разрабатывается и обновлять классы одновременно.Вы стали бы использование заглушки и оболочки для вызовов, что проект делает на другие проекты в решении, или на другие сборки, на которые ссылается проект.

Как общие рекомендации, используйте заглушки для вызовов в решении Visual Studio и оболочки для вызовов к другим сборкам.Это происходит потому, что в собственное решение рекомендуется отделить компоненты, указав интерфейсы способом, заштырить требуется.Однако внешние сборки, такие как System.dll обычно не предоставляются с отдельной определений интерфейса, поэтому следует использовать вместо оболочки.

Другие вопросы:

Производительность. Заклинивает выполняются медленно выполняется, поскольку они перезаписывают код во время выполнения.Заглушки не имеют такой нагрузку производительности и, насколько быстро как виртуальные методы необходимы.

Статические методы, запечатанные типы. Можно использовать только заглушки для реализации интерфейсов.Таким образом, типы заглушки нельзя использовать для статических методов, не виртуальных методов, запечатанных виртуальных методов методов в запечатанных типах и т. д.

Внутренние типы И заглушки и оболочки можно использовать с внутренними типами, которые становятся доступными с помощью атрибута сборки InternalsVisibleToAttribute.

Закрытые методы. Оболочки могут заменить вызовы к закрытым методам, если все типы в сигнатуре метода являются видимыми.Суррогаты могут заменить только видимые методы.

Интерфейсы и абстрактные методы Заглушки предоставляют реализации интерфейсов и абстрактные методы, которые можно использовать при тестировании.Оболочки не могут инструментирования интерфейсы и абстрактные методы, поскольку они не имеют тела метода.

Как правило, рекомендуется использовать заглушки для выявления из зависимостей в коде.Для этого можно скрывать компоненты интерфейсами.Оболочки можно использовать, чтобы изолироваться от сторонних компонентов, которые не предоставляют пригодного для тестирования API.

Начало работы с заглушками

  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. Добавьте сборку фальшивок

    1. В обозревателе решений разверните представляют собой список тестового проекта.При работе в Visual Basic, необходимо выбрать Показать все файлы для просмотра списка представляют собой.

    2. Выделите ссылку на сборку, в которой интерфейс (например IStockFeed) указан.В контекстном меню данной ссылки выберите Добавить сборку имитаций.

    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 создает класс заглушки.Имя класса, производного от имени заглушки интерфейса, с "Fakes.Stub" в качестве префикса и добавлены имена типа параметра.

    Заглушки также создаются для получений и установки свойств, событий и для универсальных методов.Для получения дополнительной информации см. Использование заглушек для изоляции частей приложений друг от друга при модульном тестировании.

Начало работы с оболочками

Предположим, что компонент содержит вызовы DateTime.Now:

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

Во время тестирования, который будут заклинить свойство Now, поскольку существует версия неудобным возвращает новое значение при каждом вызове.

Для использования оболочек не следует изменять код приложения или запись ему способ.

  1. Добавьте сборку фальшивок

    В обозревателе решений откройте ссылки проекта модульного теста и выделите ссылка на сборку, содержащую метод требуется подмена идентификаторов.В этом примере класс DateTime в System.dll.Чтобы просмотреть ссылки в проекте Visual Basic, выберите Показать все файлы.

    Выберите Добавить сборку имитаций.

  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
    

    Имена классов оболочки строятся с помощью префикса Fakes.Shim на имя исходного типа.Имена параметров добавляются в имени метода.

В предыдущем примере используется оболочку для статического метода.Для использования оболочки для метода экземпляра запись AllInstances между именем типа и имени метода.

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

Можно также создать оболочки для отдельных экземпляров, для конструкторов и свойств.Для получения дополнительной информации см. Использование оболочек совместимости для изоляции приложения от других сборок при модульном тестировании.

В данном разделе

Использование заглушек для изоляции частей приложений друг от друга при модульном тестировании

Использование оболочек совместимости для изоляции приложения от других сборок при модульном тестировании

Формирование и компиляция кода, а также соглашения об именовании в Microsoft Fakes