2017-02-22 6 views
0

Имея проблемы с выполнением моего тестового набора (используя ReSharper), похоже, что статический набор результатов противоречит друг другу, когда несколько тестовых классов запускаются вместе, а не проблема для отдельного запустить. структура, по существу, аналогична этому:«Общая» тестовая установка (ClassInitialize) в MSTest с использованием наследования базового класса

public class TestBase 
{ 
    protected static Sum Target; 

    protected static void Init(int a, int b) 
    { 
     Target = new Sum(a, b); 
    } 
} 

[TestClass] 
public class TestClass1 : TestBase 
{ 
    [ClassInitialize] 
    public static void Setup(TestContext context) { Init(1, 2); } 

    [TestMethod] 
    public void Test() 
    { 
     Assert.AreEqual(3, Target.Result); 
    }  
    ... // plus around 20 tests 
} 

[TestClass] 
public class TestClass2 : TestBase 
{ 
    [ClassInitialize] 
    public static void Setup(TestContext context) { Init(3, 4); } 

    [TestMethod] 
    public void Test() 
    { 
     Assert.AreEqual(7, Target.Result); // failed. Expected:<7>. Actual:<3> 
    } 
    ... // plus around 20 tests 
} 

Я понимаю, что это из-за мое плохое использование статических переменных и будет ценитель хороших предложений о том, как структурировать это лучше, если предположить, у меня есть около 20 модульных тестов в каждый тестовый класс и тестовая установка являются более сложными, чем приведенные выше иллюстрации.

+1

Вы понимаете, что проблема связана с плохим использованием/дизайном со статическими переменными, но они не хотят исправлять проблему и вместо этого хотят, чтобы мы разработали способ устранения симптомов. Не так много другого можно предложить. Это характер ООП и статических переменных. – Nkosi

+0

благодарит за комментарий. на самом деле я надеялся на обходной путь, похожий на нестатический «OneTimeSetUp» NUnit – Tsar

+0

Вот что такое атрибут «TestInitialize» - это эквивалент! – toadflakz

ответ

1

Вы можете легко решить эту проблему, удалив static и изменив ClassInitialize на TestInitialize.

public class TestBase 
{ 
    protected Sum Target; 

    protected void Init(int a, int b) 
    { 
     Target = new Sum(a, b); 
    } 
} 

Удаление static делает Target поля локального для определения класса test1 и test2. Изменение ClassInitialize на TestInitialize означает, что значение Target обновляется до запуска каждого TestMethod, а не при первом экземпляре класса.

+0

извините, нежизнеспособно. см. править – Tsar

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