Эти три теста идентичны, за исключением того, что они используют другую статическую функцию для создания экземпляра StartInfo. Я имею этот шаблон, подходящий вся канавка мой тестовый код, и хотел бы быть смочь упростить это использование [Тестовый сценарий] или любой другой путь, который уменьшает шаблонный код. Насколько я знаю мне не разрешают использовать делегата в качестве [Тестовый сценарий] аргумент, и я надеюсь, что у людей здесь есть творческие идеи о том, как сделать код ниже более краткого.
[Test]
public void ResponseHeadersWorkinPlatform1()
{
DoResponseHeadersWorkTest(Platform1StartInfo.CreateOneRunning);
}
[Test]
public void ResponseHeadersWorkinPlatform2()
{
DoResponseHeadersWorkTest(Platform2StartInfo.CreateOneRunning);
}
[Test]
public void ResponseHeadersWorkinPlatform3()
{
DoResponseHeadersWorkTest(Platform3StartInfo.CreateOneRunning);
}
void DoResponseHeadersWorkTest(Func<ScriptResource,StartInfo> startInfoCreator)
{
ScriptResource sr = ScriptResource.Default;
var process = startInfoCreator(sr).Start();
//assert some things here
}
Во-первых, я не думаю, что оригинал слишком плох. Это сложно, только если ваши утверждения отличаются от тестового случая к тестовому случаю.
В любом случае, вы можете использовать тестовый пример, но это не может быть сделано через стандартный атрибут [TestCase] из-за использования более сложных типов. Вместо этого вам нужно использовать публичный IEnumerable<> в качестве поставщика данных, а затем пометить ваш метод тестирования атрибутом [TestCaseSource].
Попробуйте сделать что-то вроде:
public IEnumerable<Func<ScriptResource, StartInfo>> TestCases
{
get
{
yield return Platform1StartInfo.CreateOneRunning;
yield return Platform2StartInfo.CreateOneRunning;
yield return Platform3StartInfo.CreateOneRunning;
}
}
[TestCaseSource("TestCases")]
public void MyDataDrivenTest(Func<ScriptResource, StartInfo> startInfoCreator)
{
ScriptResource sr = ScriptResource.Default;
var process = startInfoCreator(sr);
// do asserts
}
}
Это более сжатая версия стандартного шаблона выдачи экземпляров TestCaseData, содержащих параметры. Если вы передаете экземпляры TestCaseData, вы можете добавить больше информации и поведения к каждому тесту (например, ожидаемые исключения, описания и т.д.), но это немного более многословно.
Отчасти мне нравится то, что вы можете сделать один метод для "act" и один метод для "assert", а затем смешивать и сопоставлять их независимо друг от друга. Например, мой друг вчера делал кое-что, где он использовал два Actions, чтобы сказать ("когда вызывается метод Blah, этот метод на ViewModel должен быть запущен"). Очень лаконично и эффективно!
Выглядит хорошо. Может быть, вы хотите добавить фабрику? Или вы можете добавить эти методы в список действий (в тестовой установке) и вызвать делегат первого действия, делегат второго действия и делегат третьего действия.