2010-05-06 3 views
6

Эти три теста идентичны, за исключением того, что они используют другую статическую функцию для создания экземпляра StartInfo. У меня есть эта модель, идущая по всему тестовому коду, и мне понравилось бы , чтобы иметь возможность упростить это с помощью [TestCase] ​​или любым другим способом, который уменьшает шаблонный код. Насколько мне известно, мне не разрешено использовать делегат в качестве аргумента [TestCase], и ​​я надеюсь, что у людей здесь есть творческие идеи о том, как сделать код ниже более кратким.Как упростить эти тесты NUNit?

[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 
    } 

ответ

8

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

В любом случае, вы можете использовать тестовый блок , но это невозможно с помощью стандартного атрибута [TestCase] ​​из-за использования более сложных типов. Вместо этого вам необходимо использовать общедоступный IEnumerable <> как поставщик данных, а затем пометить свой тестовый метод атрибутом [TestCaseSource].

Try что-то вроде:

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, вы можете добавить больше информации и поведения к каждому тесту (например, ожидаемые исключения, описания и т. Д.), Но это немного более подробный.

Часть причины, по которой мне действительно нравится этот материал, заключается в том, что вы можете сделать один метод для своего «действия» и один метод для вашего «assert», а затем смешать и сопоставить их независимо. Например. мой друг что-то делал вчера, где он использовал две действия, чтобы сказать («когда вызывается метод« Бла », этот метод на ViewModel должен быть запущен»). Очень краткий и эффективный!

+1

научил меня новой концепции !!! плюс +1 – Prashant

+0

+1 приятный. Вот улучшенная [ссылка NUnit doc с примерами] (http://nunit.org/index.php?p=testCaseSource&r=2.5.10). –

0

Он выглядит хорошо. Вы хотите добавить завод, может быть? Или вы можете добавить эти методы в список действий (в тестовой настройке) и вызвать делегат первого действия, делегат второго действия и делегат третьего действия.