2013-08-28 2 views
10

В основном я хочу иметь возможность подключаемых методов к TestCase или TestFixture в NUnit для изменения поведения. В сущности, я хочу сделать это:Есть ли способ передать делегатов в NUnit TestCase или TestFixture?

[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: не удается преобразовать из 'группы методов' чтобы «объект»
  • Error 7 Аргумент 2: не может преобразовать из «группы методов» до «объекта»
  • Error 8 Аргумент 3: не может преобразовать из «группы методов» до «объекта»

Знаете ли вы, есть ли способ получить это или что-то в этом роде?

ответ

15

Это место, где находится 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(); 
} 

Как отмечает Андерс, можно использовать кортежи, чтобы поддержать более сложный список аргументов; но мой проект находится в .Net 3.5, который не поддерживает Tuples.

Смежные вопросы