Унаследованный тестовый класс из универсальной базы игнорируется в 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 теперь существует концепция "общего проекта", которая является способом формализовать идею добавления исходного кода из другого проекта в ваш проект, а затем скомпилировать их как один.
Вот что я сделал
- Создать новый проект "Общие проекты"
- Переместить текущий базовый класс теста (и другие необходимые файлы) в общий проект
- Добавьте ссылку на общий проект из вашего тестового проекта (подробнее об этом ниже)
- Компилируй, тестируй и веселись
По крайней мере, в обновлении 2 VS2015 шаг 3 не так прост, как мне кажется. Согласно этому ответу Visual Studio не предоставляет вам простой способ связать общие проекты с тестовыми проектами (см. Рисунок...). Вот что я должен был сделать:
- Выгрузите файл.csproj,
- Щелкните правой кнопкой мыши и отредактируйте файл.csproj.
Пройдите весь путь до самого дна и добавьте это в начало
<Import ...>
группировка (исправьте путь и имя по необходимости, обязательно добавьтеLabel="Shared"
!):<Import Project="..\SharedProject\SharedProject.projitems" Label="Shared" />
Сохраните и закройте файл
- Перезагрузить проект
Ничего особенного, но есть еще один способ решения проблемы путем вызова базовых методов:
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
Рекомендации: