Есть ли способ передать делегатов в NUnit TestCase или 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: невозможно преобразовать из "группы методов" в "объект"
Знаете ли вы, есть ли способ заставить это или что-то вроде этого работать?
Ответы
Ответ 1
Здесь TestCaseSourceAttribute приходит на помощь.
Сначала определите массив объектов, содержащий список тестовых примеров. Затем вызовите тестовые примеры, ссылаясь на массив объектов как Test
[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[]
для создания строго типизированных списков аргументов.
Ответ 2
Основываясь на прекрасном ответе Андерса:
Вместо массива делегатов можно использовать тип NUnit TestCaseData.
Это имеет несколько преимуществ. Во-первых, вы можете передать параметры нескольких типов методу тестирования. (В этом случае это не нужно, но это было полезно в моем случае.) Во-вторых, вы можете добавить дополнительные свойства к объекту TestCaseData. В моем случае я использовал .SetName для добавления имени в каждый тестовый пример, так что графический интерфейс NUnit четко идентифицирует тестовый сценарий, который запущен. Чтобы изменить пример Андерса:
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();
}
Как упоминает Андерс, можно использовать Tuples для поддержки более сложного списка аргументов; но мой проект находится в .Net 3.5, который не поддерживает Tuples.