Я настраиваю модульные тесты пользовательского класса в VS2015. Я заметил что-то, что показалось странным при запуске двух методов тестирования в одном классе. Вот упрощение задачи:Новый экземпляр объекта на самом деле повторно использует существующий объект
public MyClass
{
private List<string> _MyList = new List<string>();
public void AddItem(string s)
{
_MyList.Add(s);
}
public List<string> GetList()
{
return _MyList;
}
}
[TestMethod]
public void AddSingleItem()
{
MyClass instance = new MyClass();
instance.AddItem("string 1");
Assert.AreEqual(1, instance.GetList().Count);
}
[TestMethod]
public void AddMultipleItems()
{
MyClass instance = new MyClass();
instance.AddItem("string 1");
instance.AddItem("string 2");
Assert.AreEqual(2, instance.GetList().Count);
}
Проблема заключается в том, что первый тест проходит нормально, а второй тест проходит нормально при запуске самостоятельно, но если работать вместе второй тест проваливается говоря, что утверждают, ожидается и фактические разные, как если бы методы добавляли строки к одному и тому же объекту (несмотря на то, что создали новый экземпляр).
Я добавил конструктор к классу, который гарантирует, что _MyList
будет очищен при его создании, что решило проблему, но я хочу понять, следует ли это ожидать и почему? Стандартная практика заключается в том, чтобы заставить ваши конструкторы по умолчанию очистить все ваши свойства? Кажется странным, что new MyClass()
фактически не генерирует совершенно новый экземпляр.
Для справки, вот конструктор я упомянул:
public MyClass()
{
_MyList.Clear();
}
Описанный вами код демонстрирует поведение, о котором вы говорите, или упростил его, а затем не запускал тесты? – StriplingWarrior
Я не тестировал этот код точно, но он содержит все части, участвующие в модульных тестах. Я буду быстро издеваться над этим, чтобы быть уверенным, что он воспроизводится с помощью этого кода. – thanby
Пожалуйста, прочтите руководство [MCVE] еще раз. Нет смысла публиковать какой-либо код, который не имеет никакого отношения к вашей проблеме. –