Как мне упростить эти тесты NUNit? - PullRequest
6 голосов
/ 07 мая 2010

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

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

Ответы [ 2 ]

8 голосов
/ 07 мая 2010

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

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

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

0 голосов
/ 07 мая 2010

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

...