Реализация TestCleanup()

#c# #unit-testing

#c# #модульное тестирование

Вопрос:

Как бы я написал метод [TestCleanup()] для этих [TestMethod()] .

У меня есть 11 из следующих:

При запуске по отдельности они проходят, когда не выполняются одновременно, проходят первые

 [TestMethod()]
public void SplitTdsNameTest_SimpleValidName2()
{
    string tdsName = "Mr Daniel George Trunley";
    MemberName expected = new MemberName("Mr", "Daniel George", "Trunley");
    MemberName actual;
    actual = TdsTransformer.SplitTdsName(tdsName);
    Assert.AreEqual(expected, actual);
}


[TestMethod()]
public void SplitTdsNameTest_SimpleValidName3()
{
    string tdsName = "Daniel George Trunley";
    MemberName expected = new MemberName("", "", "Daniel George Trunley");
    MemberName actual;
    actual = TdsTransformer.SplitTdsName(tdsName);
    Assert.AreEqual(expected, actual);
}
  

Имя участника:

 public struct MemberName
{
    public string Title;
    public string FirstNames;
    public string LastNames;

    public MemberName(string title, string firstNames, string lastNames)            
    {            
        Title = title;
        FirstNames = firstNames;
        LastNames = lastNames;
    }
}
  

Разделение:

 public MemberName SplitTdsName(string tdsName)
    {
        return NameSplitter.Splitter(tdsName);
    }
  

Разделитель:

 public static MemberName Splitter(string fullName)
    {
        nameInFull = fullName;
        SetAllowedTitles();
        SplitNamesAndRemovePeriods();
        SetTitles();
        MemberName splitName = new MemberName(titles, firstNames, lastNames);
        return splitName;
    }
  

Комментарии:

1. TdsTransformer это экземпляр или ссылка на класс (так что это SplitTdsName статический метод или метод экземпляра)? SplitTdsName Сохраняются ли старые данные? Предоставили ли вы надлежащие реализации равенства внутри MemberName ? С учетом вашего редактирования недостаточно.

2. @AnthonyPegram достаточно ли этой информации? Или это потребует большего?

3. Я согласен с Остином в его ответе, меня беспокоит статический метод и задействованное глобальное состояние. Я также беспокоюсь о структуре, ее изменчивости и т. Д. Я думаю, вам, вероятно, следует пересмотреть свой дизайн.

4. Я унаследовал этот дизайн и, к сожалению, не могу его изменить

Ответ №1:

Исходя из предоставленного, не похоже, что какая-либо очистка необходима.

Если есть TestInitialize метод, просто отмените то, что там сделано.

Если TdsTransformer.SplitTdsName сохраняется какое-либо внутреннее состояние, вам также придется его очистить. Хотя, если это так, это, вероятно, не должно быть статическим методом.

Основываясь на изменениях, эти два метода меня беспокоят:

     SetAllowedTitles();
    SetTitles();
  

Они подразумевают наличие внутреннего состояния, которое, на мой взгляд, очень плохо для статического класса. Вероятно, это проблема, с которой вы сталкиваетесь, когда последовательные тесты не проходят.

Чтобы исправить это и сохранить его статичным, пусть они возвращают значения вместо сохранения в статических элементах:

     var allowedTitles = SetAllowedTitles(fullName);
    var names = SplitNamesAndRemovePeriods(fullName);  //likely a struct or class with first/last names
    var titles = SetTitles(allowedTitles);