#unit-testing #moq
#модульное тестирование #moq
Вопрос:
Во многих случаях я пишу код с защищенными виртуальными методами для обеспечения швов (для помощи в модульном тестировании):
public class TemporaryStorage
{
public TemporaryStorage()
{
this.RootPath = Path.Combine(this.GetEnvironmentPath, Path.GetRandomFileName());
}
public string RootPath { get; private set; }
protected virtual string GetEnvironmentPath
{
get { return LocalStorage.GetEnvironmentPath(); }
}
}
Затем в наборе тестов я буду производным от этого класса и предоставлю пользовательскую реализацию для GetEnvironmentPath() .
Доступен ли лучший подход вместо создания производного класса в наборе тестов? Могу ли я использовать MOQ для достижения тех же результатов (предоставляя реализацию замены для GetEnvironmentPath)?
С уважением,
Ответ №1:
Самый простой способ издеваться над тестируемыми классами — использовать интерфейсы. Когда ваш тестируемый класс реализует определенный интерфейс, вы можете просто написать макет, используя MOQ, например:
Допустим, у вас есть такой интерфейс:
private interface IMyInterface
{
string MyMethod(int value);
int MyProperty { get; set; }
}
Затем вы можете настроить макет следующим образом:
var mockedObject = new Mock<IMyInterface>();
mockedObject.Setup(x => x.MyMethod(It.IsAny<int>())).Returns<int>(value => value.ToString());
mockedObject.SetupGet(x => x.MyProperty).Returns(42);
Таким образом, вы можете получить доступ к своему издевательскому объекту в своем модульном тестировании:
DoSomething(mockedObject.Object);
Ответ №2:
Rhino Mocks — одна из фреймворков для создания макетов, которая поддерживает это.
Если вы посмотрите на следующую информацию, вы увидите пример.
Чтобы убедиться, что защищенный метод может быть протестирован по модулю, вы можете изменить подпись на internal protected вместо protected . Если вы затем используете InternalsVisibleTo в вашем AssemblyInfo.cs, вы можете сделать свои внутренние элементы видимыми для проекта модульного тестирования (см. Как сделать «защищенный» метод доступным для «частичного» макетирования с использованием RhinoMocks).