NUnit TestCaseSource передает значение фабрике

Я использую атрибут NUnit 2.5.3 TestCaseSource и создаю фабрику для генерации моих тестов. Что-то вроде этого:

[Test, TestCaseSource(typeof(TestCaseFactories), "VariableString")]
public void Does_Pass_Standard_Description_Tests(string text)
{
    Item obj = new Item();
    obj.Description = text;
}

Мой источник таков:

public static IEnumerable<TestCaseData> VariableString
{
    get
    {
        yield return new TestCaseData(string.Empty).Throws(typeof(PreconditionException))
            .SetName("Does_Reject_Empty_Text");
        yield return new TestCaseData(null).Throws(typeof(PreconditionException))
            .SetName("Does_Reject_Null_Text");
        yield return new TestCaseData("  ").Throws(typeof(PreconditionException))
            .SetName("Does_Reject_Whitespace_Text");
    }
}

Что мне нужно сделать, это добавить проверку максимальной длины в строку переменной, но эта максимальная длина определяется в контрактах в тестируемом классе. В нашем случае это простая публичная структура:

   public struct ItemLengths
    {
        public const int Description = 255;
    }

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

Я хочу добавить следующую строку в мой тестовый пример:

yield return new TestCaseData(new string('A', MAX_LENGTH_HERE + 1))
    .Throws(typeof(PreconditionException));

Что-то довольно простое по своей концепции, но то, что я считаю невозможным. Какие-либо предложения?

2 ответа

Измените параметр вашего теста как класс вместо строки. Вот так:

открытый класс StringTest {открытая строка testString; public int maxLength; }

Затем создайте этот класс для передачи в качестве аргумента в конструктор TestCaseData. Таким образом, вы можете передать строку и любые другие аргументы, которые вам нравятся.

Другой вариант - сделать так, чтобы в тесте было 2 аргумента string и int.

Затем для TestCaseData( "mystring", 255). Вы поняли, что они могут иметь несколько аргументов?

Wayne

Я столкнулся с подобной проблемой, как ваша, и закончил тем, что написал небольшое дополнение NUnit и пользовательский атрибут, который расширяет атрибут NUnit TestCaseSourceAttribute. В моем конкретном случае меня не интересовала передача параметров фабричному методу, но вы могли легко использовать ту же технику для достижения того, что вы хотите.

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

PS. Чтобы использовать эту технику, вы должны использовать NUnit 2.5 (как минимум) Удачи.

Другие вопросы по тегам