понедельник, 12 ноября 2012 г.

Юнит тестирование в C#. Unit test in C#. Использование mock объектов.

Начнем с основ. Википедия нам с радостью скажет, что mock-объект это объект-имитация или объект-пародия. Данные объекты нужны для упрощения написания модульных тестов зависимых от смежных проектов. Например у нас есть большой проект, в рамках которого работает несколько команд над своими проектами. Архитекторы с аналитиками проработали и согласовали интерфейсы. Но сложность и скорость разработки у каждой команды своя. А у нас есть зависимый от другой команды код, в котором планируется получать значение из сервиса разрабатываемого другой командой. В том числе и при написании тестов. В данном случае нам на помощь и приходят различные mock фреймворки.

 Небольшое отступление. В Visual studio 2012 в тестовом фреймворке есть namespace System.Fakes. Который предоставляет встроенные заглушки.  

Мой выбор пал на Moq. Т.к. его хвалили на stackoverflow :). 
И так предположим у нас есть интерфейс
public class Contracts { public interface IUrlManager { UrlList GetByUserGuid(Guid id); } public enum UrlList { First = 1, Second = 2, } }
В коде теста нам необходимо используя скаченный фреймворк "заглушить" или как еще говорят застабить, сервис, который его должен реализовывать. 
Все стандартно в Reference тестового проекта подключаем Moq.dll

Далее в коде теста создаем мок по нужному нам интерфейсу.

var moc = new Mock(); // затем используя лямбда выражение пишем простую реализацию метода moc.Setup(urlmanager => urlmanager.GetByUserGuid(new Guid("cb1e6c68-8750-4234-aaf1-abcaa3583eff"))).Returns(Contracts.UrlList.First) // вызываем метод var mocresult = moc.Object.GetByUserGuid(new Guid("cb1e6c68-8750-4234-aaf1-abcaa3583eff"));

Подробнее про различные кейсы использования фреймворка описано на одной из страниц ресурса


Комментариев нет: