NUnit TestCaseSource передает значение фабрике - PullRequest
6 голосов
/ 18 февраля 2010

Я использую атрибут 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 ]

2 голосов
/ 30 октября 2010

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

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

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

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

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

Уэйн

1 голос
/ 12 декабря 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...