Как я упрощаю эти тесты NUNit?

Эти три теста идентичны, за исключением того, что они используют другую статическую функцию для создания экземпляра 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
    }
6
задан Lucas Meijer 6 May 2010 в 21:32
поделиться

2 ответа

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

В любом случае, вы можете использовать тестовый пример, но это не может быть сделано через стандартный атрибут [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 должен быть запущен"). Очень лаконично и эффективно!

8
ответ дан 16 December 2019 в 21:36
поделиться

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

0
ответ дан 16 December 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: