2016-06-08 3 views
-2

Я настраиваю модульные тесты пользовательского класса в 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(); 
} 
+0

Описанный вами код демонстрирует поведение, о котором вы говорите, или упростил его, а затем не запускал тесты? – StriplingWarrior

+0

Я не тестировал этот код точно, но он содержит все части, участвующие в модульных тестах. Я буду быстро издеваться над этим, чтобы быть уверенным, что он воспроизводится с помощью этого кода. – thanby

+2

Пожалуйста, прочтите руководство [MCVE] еще раз. Нет смысла публиковать какой-либо код, который не имеет никакого отношения к вашей проблеме. –

ответ

2

Там нет причин, чтобы получить информацию о поведении вы описывающее с кодом вы публикуемым. Я предполагаю, что в вашем упрощении проблемы вы изменили что-то важное. Скорее всего, это то, что ваше частное поле:

private List<string> _MyList = new List<string>(); 

, вероятно, статический:

private static List<string> _MyList = new List<string>(); 

Это может привести каждый экземпляр вашего класса повторно использовать один и тот же экземпляр. Добавление конструктора, который сбрасывает это значение, даст вид исправления проблемы, но это вызовет больше проблем в будущем, потому что первый экземпляр, который вы создали, будет иметь свой список сбрасывать каждый раз, когда создается новый экземпляр. Вероятно, вы начнете видеть странные условия гонки, которые трудно отследить, и так далее.

Если это так, убедитесь, что поле не static должно исправить ситуацию.

+0

Derp. Точная проблема. Я соглашусь, как только позволяет таймер. – thanby

Смежные вопросы