Я плохо знаком с насмешкой/тестированием и желанием знать то, во что уровень должен Вы переходить при тестировании. Например, в моем коде у меня есть следующий объект:
public class RuleViolation
{
public string ErrorMessage { get; private set; }
public string PropertyName { get; private set; }
public RuleViolation( string errorMessage )
{
ErrorMessage = errorMessage;
}
public RuleViolation( string errorMessage, string propertyName )
{
ErrorMessage = errorMessage;
PropertyName = propertyName;
}
}
Это - относительно простой объект. Таким образом, мой вопрос:
Этому нужен модульный тест?
Если это делает то, что я тестирую и как?
Спасибо
Я бы сказал, наверное, нет. Единственное, что вы, вероятно, захотите проверить, насколько это важно, - это модификаторы доступа:
public string ErrorMessage { get; private set; }
public string PropertyName { get; private set; }
Если действительно действительно важно, чтобы код вне класса не мог их изменять, это, возможно, единственное, что я бы попытался проверить.
Вот как вы можете получить аксессоры в свойстве:
class Program
{
static void Main(string[] args)
{
var property = typeof(Test).GetProperty("Accessor");
var methods = property.GetAccessors();
}
}
public class Test
{
public string Accessor
{
get;
private set;
}
}
С помощью свойства .GetAccessors ();
Вы можете увидеть, есть ли там установщик. Если да, то сеттер общедоступен. (Существуют также свойства IsPrivate и IsPublic, которые вы также можете использовать для проверки других средств доступа).
Если бы это был мой код и мой объект, у меня были бы тесты, независимо от того, насколько прост или сложен класс, точка. Даже если класс вряд ли сломается, тесты - это то место, где, ИМО, вы документируете свои предположения, проектные решения и правильное использование.
Поступая таким образом, вы не только подтверждаете, что то, что у вас есть, работает так, как задумано, но и имеете возможность продумать типичные сценарии (что произойдет, если параметры ctor пустые или пустые или содержат пробелы в конце? Почему PropertyName необязательно в неизменяемом классе?).
И ЕСЛИ (когда?) Требования изменятся, у вас есть прочная отправная точка для решения этой проблемы. И ЕСЛИ этот тривиальный класс каким-то образом плохо взаимодействует со всеми другими классами, у вас может быть тест, чтобы уловить это до того, как это сделают ваши клиенты.
Это просто правильный способ разработки вашего кода.
HTH,
Беррил
Вы можете выполнить модульное тестирование этого объекта, но это настолько просто, что оно не требуется. Тест будет чем-то вроде (пример NUnit)
[Test]
public void TestRuleViolationConstructorWithErrorMessageParameterSetsErrorMessageProperty() {
// Arrange
var errorMessage = "An error message";
// Act
var ruleViolation = new RuleViolation(errorMessage);
// Assert
Assert.AreEqual(errorMessage, ruleViolation.ErrorMessage);
}
Однако написание тестов, подобных этим, не имеет особого смысла, поскольку вы проверяете правильность работы свойств платформы .NET. Как правило, вы можете быть уверены, что Microsoft имеет это право: -)
Что касается имитации, это полезно, когда ваш тестируемый класс имеет зависимость, возможно, от другого класса в вашем собственном приложении или от типа из фреймворка. Фреймворки имитации позволяют вызывать методы и свойства в зависимости от зависимости, не беспокоясь о построении зависимости конкретно в коде, и вместо этого позволяют вводить определенные значения для свойств, возвращаемые значения для методов и т. Д. Moq отличный фреймворк, и тест для базового класса с зависимостями будет выглядеть примерно так:
[Test]
public void TestCalculateReturnsBasicRateTaxForMiddleIncome() {
// Arrange
// TaxPolicy is a dependency that we need to manipulate.
var policy = new Mock<TaxPolicy>();
bar.Setup(x => x.BasicRate.Returns(0.22d));
var taxCalculator = new TaxCalculator();
// Act
// Calculate takes a TaxPolicy and an annual income.
var result = taxCalculator.Calculate(policy.Object, 25000);
// Assert
// Basic Rate tax is 22%, which is 5500 of 25000.
Assert.AreEqual(5500, result);
}
TaxPolicy
будет модульно протестирован в его собственном приспособлении, чтобы убедиться, что он ведет себя правильно.Здесь мы хотим проверить, что TaxCalculator
работает правильно, поэтому мы имитируем объект TaxPolicy
, чтобы упростить наши тесты; при этом мы можем указать поведение только тех битов TaxPolicy
, которые нас интересуют. Без него нам пришлось бы вручную создавать макеты / заглушки / подделки или создавать реальные экземпляры TaxPolicy
для передачи.
Однако в Moq есть нечто большее, чем это; ознакомьтесь с кратким руководством , чтобы узнать больше о его возможностях.
он не содержит никакой логики => нечего проверять
{{1} }Даже если это просто, в ваших конструкторах есть логика. Я бы проверил это:
RuleViolation ruleViolation = new RuleViolation("This is the error message");
Assert.AreEqual("This is the error message", ruleViolation.ErrorMessage);
Assert.IsEmpty(ruleViolation.PropertyName);
RuleViolation ruleViolation = new RuleViolation("This is the error message", "ThisIsMyProperty");
Assert.AreEqual("This is the error message", ruleViolation.ErrorMessage);
Assert.AreEqual("ThisIsMyProperty", ruleViolation.PropertyName);