Как вызвать метод теста с несколькими параметрами (NUnit) - PullRequest
0 голосов
/ 04 мая 2018

Мой метод испытаний выглядит так:

public static List<Something> Generator() {
return A.GenerateObjects();
}

[Test, TestCaseSource(nameof(Generator))]
    public void DoSomething(Something abc) {/*do something*/}

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

Я хочу включить в метод другой параметр, например:

public void DoSomething(Something abc, string def)

Я пробовал это с этими строками, но это не сработало:

public static object[] Case =
    {
        new object[]
        {
            A.GenerateObjects(),
            someStrings
        }
    };

Может быть, выполнить итерацию списка с помощью функции цикла вместо прямого вызова метода (GenerateObjects ())? Я также не понимаю, как Nunit может распознавать объекты из списка напрямую, используя только TestCaseSource (nameof (Generator))

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Ваш первоначальный тест принимает один аргумент типа Something. Очевидно, A.GenerateObjects() возвращает какой-то IEnumerable из этих объектов - вы не показываете детали. Поскольку тест является методом с одним аргументом, он работает. NUnit предоставляет особый случай для методов с одним аргументом, который очень прост и примет массивы объектов или требуемого типа и сгенерирует для вас тестовые случаи.

Однако, для нескольких аргументов, вы сами должны вернуть набор тестовых случаев из вашего метода. Как вы, наверное, знаете, аргументы метода в C # имеют форму object[], содержащую аргументы, например new object[] { aSomething, "astring" }.

Предполагая, что у вас есть определенные строки, которые должны быть связаны с каждым объектом, вы должны сами установить эту связь. Как это сделать, зависит от деталей того, что вы пытаетесь сделать.

У вас есть список строк, которые вы хотите связать со списком объектов один за одним? В этом случае прекратите использовать [TestCaseSource] и используйте [ValueSource] или [Values] для каждого параметра метода тестирования. Примените [Sequential] к методу, чтобы NUnit сопоставлял объекты и строки один за другим. Вот пример ...

[Test, Sequential]
public void DoSomething(
    [ValueSource(typeof(A), nameof(GetObjects)] Something abc,
    [Values("string1", "string2", "string3")] string def)
{/*do something*/}

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

0 голосов
/ 04 мая 2018

Вы можете вернуть IEnumerable из TestCaseData следующим образом:

    public static IEnumerable<TestCaseData> Generator()
    {
        yield return new TestCaseData(new Something { SomeValue = "Hi" }, "Foo").SetName("FirstTest");
        yield return new TestCaseData(new Something { SomeValue = "Bye" }, "Bar").SetName("SecondTest");
    }

    [Test]
    [TestCaseSource(nameof(Generator))]
    public void DoSomething(Something abc, string def)
    {
        Console.WriteLine($"{abc.SomeValue},{def}");
    }

SetName является необязательным, просто если вы хотите более значимое имя, чем имя по умолчанию, которое оно составляет.

Я также не понимаю, как Nunit может распознавать объекты из список напрямую только с TestCaseSource (nameof (Generator))

Nunit замечает атрибут TestCaseSource в методе test, а затем использует отражение для вызова метода «Generator». (Nameof - просто сахар, компилятор заменяет его реальным именем при его создании). Каждый объект TestCaseData, который возвращается, является другим контрольным примером. В моем примере выше тесты будут выполняться дважды. FirstTest будет иметь экземпляр Something, в котором для SomeValue установлено значение Hi, а для строки def задано значение Foo. SecondTest будет иметь экземпляр Something, в котором для SomeValue установлено значение Bye, а также строка определения Bar.

...