Есть ли способ передать делегатов в тестовый набор 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, который не поддерживает кортежи.