Как создать тесты для, постепенно возражает

Я плохо знаком с насмешкой/тестированием и желанием знать то, во что уровень должен Вы переходить при тестировании. Например, в моем коде у меня есть следующий объект:

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;
    }
}

Это - относительно простой объект. Таким образом, мой вопрос:

Этому нужен модульный тест?

Если это делает то, что я тестирую и как?

Спасибо

5
задан lancscoder 15 April 2010 в 13:41
поделиться

5 ответов

Я бы сказал, наверное, нет. Единственное, что вы, вероятно, захотите проверить, насколько это важно, - это модификаторы доступа:

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, которые вы также можете использовать для проверки других средств доступа).

4
ответ дан 18 December 2019 в 11:54
поделиться

Если бы это был мой код и мой объект, у меня были бы тесты, независимо от того, насколько прост или сложен класс, точка. Даже если класс вряд ли сломается, тесты - это то место, где, ИМО, вы документируете свои предположения, проектные решения и правильное использование.

Поступая таким образом, вы не только подтверждаете, что то, что у вас есть, работает так, как задумано, но и имеете возможность продумать типичные сценарии (что произойдет, если параметры ctor пустые или пустые или содержат пробелы в конце? Почему PropertyName необязательно в неизменяемом классе?).

И ЕСЛИ (когда?) Требования изменятся, у вас есть прочная отправная точка для решения этой проблемы. И ЕСЛИ этот тривиальный класс каким-то образом плохо взаимодействует со всеми другими классами, у вас может быть тест, чтобы уловить это до того, как это сделают ваши клиенты.

Это просто правильный способ разработки вашего кода.

HTH,
Беррил

1
ответ дан 18 December 2019 в 11:54
поделиться

Вы можете выполнить модульное тестирование этого объекта, но это настолько просто, что оно не требуется. Тест будет чем-то вроде (пример 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
ответ дан 18 December 2019 в 11:54
поделиться

он не содержит никакой логики => нечего проверять

{{1} }
9
ответ дан 18 December 2019 в 11:54
поделиться

Даже если это просто, в ваших конструкторах есть логика. Я бы проверил это:

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);
0
ответ дан 18 December 2019 в 11:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: