MsTest. Использование абстрактных классов и наследования в тестах

Мало кому нравится повторять один и тот же код даже если он используется при написании Unit-тестов. Не говоря уже о том, что это прямое нарушение принципа DRY (Don’t repeat yourself). Потому использование даже обычного наследования помогает значительно упростить работу.

При написании тестов иногда возникает необходимость тестировать целые иерархии классов со всеми наследниками. Чаще всего в таких случаях приходится писать много однотипного кода. Конечно лучшим решением будет вынести этот код в отдельный абстрактный класс с тестами.

public abstract class BasePlayerTest
{
	protected abstract IPlayer CreatePlayer();
	
	[TestMethod]
	public void Play_OneFile_ReturnsByteArray()
	{
		IPlayer player = this.CreatePlayer();
		
		var result = player.Play();
		
		Assert.IsNotNull(result);
	}
}

[TestClass]
public class AudioPlayerTest : BasePlayerTest
{
	protected override IPlayer CreatePlayer()
	{
		return new AudioPlayer();
	}
}

[TestClass]
public class VideoPlayerTest : BasePlayerTest
{
	protected override IPlayer CreatePlayer()
	{
		return new VideoPlayer();
	}
}

При использовании кода похожего на приведенный выше система увидит, что в абстрактном классе есть метод помеченный атрибутом TestMethod и выдаст сообщение об ошибке следующего содержания: UTA004: Illegal use of attribute on BasePlayerTest.Play_OneFile_ReturnsByteArray. The TestMethodAttribute can be defined only inside a class marked with the TestClass attribute.

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

[TestClass]
[Ignore]
public abstract class BasePlayerTest
{
	// tests
}

Комментарии

Оставить комментарий