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 (как минимум) Удачи.