Слишком много аргументов предоставлено с использованием ключевого слова params с NUNIT в C# - PullRequest
0 голосов
/ 17 марта 2020

Здравствуйте, я пишу некоторые модульные тесты для приложения WPF с использованием инфраструктуры NUNIT, и я сталкиваюсь с этой проблемой :

Я пишу свои положительные контрольные примеры вот так:

public static IEnumerable<TestCaseData> ThrowExceptionOnAnyStringNull_ShouldNotThrowException_TestCases
{
    get
    {
        yield return new TestCaseData(new string[] { "", "first test argument name" });
        yield return new TestCaseData(new string[] { "test string", "first test argument name" });
        yield return new TestCaseData(new string[] { "first", "first name", "second", "second name", "third", "third name" });
    }
}

И я использую это так:

[TestCaseSource(nameof(ThrowExceptionOnAnyStringNull_ShouldNotThrowException_TestCases))]
public void ThrowExceptionOnAnyStringNull_ShouldNotThrowException (params string[] args)
{
    Assert.DoesNotThrow(() => ArgumentChecker.ThrowExceptionOnAnyStringNull(args));
}

Подпись метода для проверки:

public static void ThrowExceptionOnAnyStringNull (params string[] argsAndNames)

Ошибка Когда я запускаю тесты, я получаю от Visual Studio следующее: Предоставлено слишком много аргументов

Я попытался добавить первый параметр, как в других тестах, и он работает! но параметр остается неиспользованным.

Этот код используется с этим дополнительным параметром:

public static IEnumerable<TestCaseData> ThrowExceptionOnAnyStringNull_ShouldNotThrowException_TestCases
{
    get
    {
        yield return new TestCaseData(null, new string[] { "", "first test argument name" });
        yield return new TestCaseData(null, new string[] { "test string", "first test argument name" });
        yield return new TestCaseData(null, new string[] { "first", "first name", "second", "second name", "third", "third name" });
    }
}

[TestCaseSource(nameof(ThrowExceptionOnAnyStringNull_ShouldNotThrowException_TestCases))]
public void ThrowExceptionOnAnyStringNull_ShouldNotThrowException (Type expectedExceptionType, params string[] args)
{
    Assert.DoesNotThrow(() => ArgumentChecker.ThrowExceptionOnAnyStringNull(args));
}

У меня есть другие 53 теста с этой структурой TestCaseSource, в настоящее время работающие идеально.

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

Спасибо.

Дополнительная информация :

Вот как мой отрицательные контрольные примеры выглядят так:

public static IEnumerable<TestCaseData> ThrowExceptionOnAnyStringNull_ShouldThrowException_TestCases
{
    get
    {
        // Empty list
        yield return new TestCaseData(typeof(ArgumentNullException), null);
        // List with odd number of elements
        yield return new TestCaseData(typeof(ArgumentException)    , new string[] { null });
        yield return new TestCaseData(typeof(ArgumentException)    , new string[] { "" });
        yield return new TestCaseData(typeof(ArgumentException)    , new string[] { "test string" });
        yield return new TestCaseData(typeof(ArgumentException)    , new string[] { null, "first test argument name", null });
        yield return new TestCaseData(typeof(ArgumentException)    , new string[] { "", "first test argument name", "" });
        yield return new TestCaseData(typeof(ArgumentException)    , new string[] { "test string", "first test argument name", "other" });
        // List with even number of elements
        yield return new TestCaseData(typeof(ArgumentNullException), new string[] { null, null });
        yield return new TestCaseData(typeof(ArgumentException)    , new string[] { null, "" });
        yield return new TestCaseData(typeof(ArgumentNullException), new string[] { null, "first test argument name" });
        yield return new TestCaseData(typeof(ArgumentNullException), new string[] { "", null });
        yield return new TestCaseData(typeof(ArgumentException)    , new string[] { "", "" });
        yield return new TestCaseData(typeof(ArgumentNullException), new string[] { "test string", null });
        yield return new TestCaseData(typeof(ArgumentException)    , new string[] { "test string", "" });
        yield return new TestCaseData(typeof(ArgumentNullException), new string[] { "first", "first name", null, "second name", "third", "third name" });
    }
}

[TestCaseSource(nameof(ThrowExceptionOnAnyStringNull_ShouldThrowException_TestCases))]
public void ThrowExceptionOnAnyStringNull_ShouldThrowException (Type expectedExceptionType, params string[] args)
{
    Assert.Throws(expectedExceptionType, () => ArgumentChecker.ThrowExceptionOnAnyStringNull(args));
}

1 Ответ

2 голосов
/ 17 марта 2020

Попробуйте:

yield return new TestCaseData(new object[] { new string[] { <string array elements> }})

Проблема была object[], назначаемая из string[], поэтому ваш string[] был проанализирован, поскольку каждый элемент был одним отдельным параметром, а не одним целым параметром.

...