Унаследованный тестовый класс из универсальной базы игнорируется в MSTest

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

Результаты модульных испытаний

BaseDependencyPropertyFactoryTest находится в сборке Whathecode.PresentationFramework.Tests. Это базовый базовый класс. (BaseDependencyPropertyFactoryTest)

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

[TestClass]
public class DependencyPropertyFactoryTest
    : BaseDependencyPropertyFactoryTest<ASpecificClass>
{
}

Кажется, что выполняется только наследующий тест, расположенный в той же сборке, что и базовый класс. Унаследованный тест в сборке Whathecode.PresentationFramework.Aspects.Tests, похоже, полностью игнорируется.

Что я делаю неправильно? При желании я могу загрузить весь необходимый исходный код, но вам понадобится PostSharp для сборки аспектов.


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

[TestMethod]
public void AllBaseTests()
{
    ClrGetterSetterTest();
    DependencyPropertyGetterSetterTest();
}

Это дает следующий результат. Как ни странно, этот тест выполнен! Пока это может работать как способ, по крайней мере, запустить их, но, конечно, я не хочу редактировать этот тест каждый раз, когда добавляю дополнительные тесты в базовый класс.

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

Почему эти базовые тесты пропущены, и почему указание "Прервано"?

4 ответа

Решение

Причина этого не в обобщениях, а в тестах в разных сборках.

Предложение Microsoft Connect описывает проблему: "Visual Studio Test (MSTest) и отсутствие поддержки наследования для базовых классов, находящихся в разных сборках". Он помечен как "исправленный", но пока еще не исправлен в Visual Studio 2010, возможно, его еще нужно выпустить?

Существует один интересный способ решения этой проблемы:

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

Это сработало для меня, и я не считаю обходной путь слишком уродливым.

Ответ Стивена о добавлении исходного файла базового класса в виде ссылки и последующей компиляции его в тестовую DLL также сработал для меня.

Однако начиная с VS 2013 Update 2 теперь существует концепция "общего проекта", которая является способом формализовать идею добавления исходного кода из другого проекта в ваш проект, а затем скомпилировать их как один.

Вот что я сделал

  1. Создать новый проект "Общие проекты"
  2. Переместить текущий базовый класс теста (и другие необходимые файлы) в общий проект
  3. Добавьте ссылку на общий проект из вашего тестового проекта (подробнее об этом ниже)
  4. Компилируй, тестируй и веселись

По крайней мере, в обновлении 2 VS2015 шаг 3 не так прост, как мне кажется. Согласно этому ответу Visual Studio не предоставляет вам простой способ связать общие проекты с тестовыми проектами (см. Рисунок...). Вот что я должен был сделать:

  1. Выгрузите файл.csproj,
  2. Щелкните правой кнопкой мыши и отредактируйте файл.csproj.
  3. Пройдите весь путь до самого дна и добавьте это в начало <Import ...> группировка (исправьте путь и имя по необходимости, обязательно добавьте Label="Shared"!):

    <Import Project="..\SharedProject\SharedProject.projitems" Label="Shared" />
    
  4. Сохраните и закройте файл

  5. Перезагрузить проект

Ничего особенного, но есть еще один способ решения проблемы путем вызова базовых методов:

public abstract class AccountBaseTest
{
    protected abstract IAccountRepository GetAccountRepository();

    public void _submitAccountToLMS_BlankAccount_NewLmsID()
    {
       Account account = new Account(GetAccountRepository());
       account.FirstName = Faker.FirstName();
       account.LastName = Faker.LastName();
       account.SubmitToLms();
       Assert.IsTrue(account.LmsID > 0);
    }
}



[TestClass]
public class AccountIntegrationTest
{
    protected override IAccountRepository GetAccountRepository()
    {
        return new AccountRepository();
    }

    [TestMethod]
    public void SubmitAccountToLMS_BlankAccount_NewLmsID()
    {
       base._submitAccountToLMS_BlankAccount_NewLmsID();
    }
}

Надеюсь, VS 2012 исправит эту проблему....

Это было исправлено и поставляется в версии 1.1.17 здесь:

Framework: https://www.nuget.org/packages/MSTest.TestFramework/1.1.17

Адаптер: https://www.nuget.org/packages/MSTest.TestAdapter/1.1.17

Рекомендации:

  1. Проблема GitHub: https://github.com/Microsoft/testfx/issues/23
  2. УФ-элемент: https://visualstudio.uservoice.com/forums/330519-team-services/suggestions/6030736-support-test-inheritance-for-base-classes-in-differ
Другие вопросы по тегам