Есть ли способ передать делегатов в тестовый набор NUnit или TestFixture?
в основном я хочу иметь возможность подключать методы к TestCase или TestFixture в NUnit для изменения поведения. В сущности, я хочу сделать это:
[TestFixture]
public class MethodTests
{
public delegate void SimpleDelegate();
public static void A()
{
// Do something meaningful
}
public static void B()
{
// Do something meaningful
}
public static void C()
{
// Do something meaningful
}
[TestCase(A,B,C)]
[TestCase(C,A,B)]
[TestCase(C,B,A)]
public void Test(SimpleDelegate action1, SimpleDelegate action2, SimpleDelegate action3 )
{
action1();
action2();
action3();
}
}
ошибки, которые я получаю для [TestCase (A,B,C)], являются
- Ошибка 6 Аргумент 1: не удается преобразовать из "группы методов" в "объект"
- Ошибка 7 Аргумент 2: не удается преобразовать из "группы методов" в "объект"
- Ошибка 8 Аргумент 3: не удается преобразовать из "группы методов" в 'object'
вы знаете, есть ли способ заставить это или что-то подобное работать?
2 ответов
вот тут TestCaseSourceAttribute приходит на помощь.
сначала определите массив объектов, содержащий список тестовых случаев. Затем вызовите тестовые случаи, сославшись на массив объектов как Test
' s [TestCaseSource]
. Это должно строиться и работать, как вы намеревались.
private static readonly object[] TestCases =
{
new SimpleDelegate[] { A, B, C },
new SimpleDelegate[] { C, A, B },
new SimpleDelegate[] { C, B, A }
};
[Test, TestCaseSource("TestCases")]
public void Test(SimpleDelegate action1, SimpleDelegate action2,
SimpleDelegate action3)
{
action1();
action2();
action3();
}
Если вам нужен более сложный список аргументов, вы можете, например, использовать Tuple
вместо SimpleDelegate[]
для создания строго типизированных списков аргументов.
основываясь на прекрасном ответе Андерса:
вместо массива делегатов можно использовать тип NUnit TestCaseData.
Это имеет несколько преимуществ. Во-первых, в метод тестирования можно передавать параметры нескольких типов. (Не нужно в этом случае, но это было полезно в моем случае.) Во-вторых, можно добавить дополнительные свойства в объект TestCaseData. В моем случае, я использовал .SetName, чтобы добавить название для каждого теста так Нанит Гуй четко определяет тестовый случай выполняющийся. Чтобы изменить пример Андерса:
private static readonly object[] TestCases =
{
new TestCaseData( A, B, C ).SetName("A B C"),
new TestCaseData( C, A, B ).SetName("C A B"),
new TestCaseData( C, B, A ).SetName("C B A")
};
[Test, TestCaseSource("TestCases")]
public void Test(SimpleDelegate action1, SimpleDelegate action2, SimpleDelegate action3)
{
action1();
action2();
action3();
}
как упоминает Андерс, можно использовать кортежи для поддержки более сложного списка аргументов; но мой проект находится в .Net 3.5, который не поддерживает кортежи.