Унаследованный тестовый класс из универсальной базы игнорируется в MSTest - PullRequest
17 голосов
/ 14 мая 2011

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

Unit test results

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

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

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

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

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


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

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

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

Unit test results after edit

Почему пропускаются эти базовые тесты и почему отображается сообщение «Прервано»?

Ответы [ 4 ]

13 голосов
/ 15 мая 2011

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

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

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

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

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

2 голосов
/ 09 июня 2016

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

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

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

  1. Создатьновый проект "Shared Projects"
  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. Перезагрузите проект
2 голосов
/ 15 ноября 2011

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

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 исправит эту проблему ....

0 голосов
/ 24 апреля 2017
...