Как создать шаблонный тест в C#, который можно настроить с помощью параметров?

Почему я постоянно получаю исключение "Exception has been thrown by the target of an invocation" при вызове метода с параметрами? Пример на сайте, который я использовал, не работает, и мне нужно сделать более сложный пример. Вот код, который я использую:

[TestMethod()]
[DataTestMethod]
[DynamicData(nameof(GenerateData), DynamicDataSourceType.Method)]
public void tTest(object[] ps) { }

[TestMethod()]
[DataTestMethod]
[DynamicData(nameof(GenerateData), DynamicDataSourceType.Method)]
public void tTest(T[] t, int intVal) { }

[TestMethod()]
[DataTestMethod]
[DynamicData(nameof(GenerateData), DynamicDataSourceType.Method)]
public void tTest(object ts, object intVal) { }

public static IEnumerable<object[]> GenerateData()
{
    var ts = new List<T>();
    ts.Add(new T("t1"));
    yield return new object[] { ts.ToArray(), (int)3 };
    ts.Clear();
    //...
}

Я получаю исключение "Exception has been thrown by the target of an invocation" каждый раз, когда передаю параметры. Как правильно передать параметры? Вот сообщение об ошибке и трассировка стека:

Сообщение: Exception has been thrown by the target of an invocation.

  Трассировка стека:
  MethodInvoker.Invoke(Object obj, IntPtr* args, BindingFlags invokeAttr)
  RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
  MethodBase.Invoke(Object obj, Object[] parameters)
  • 19 сентября 2023 г. 18:59
Ответы на вопрос 1
Вы получаете исключение "Exception has been thrown by the target of an invocation" при вызове метода с параметрами, потому что ваш тестовый метод ожидает объект `object[]` в качестве параметра, но вы передаете разные типы данных (массив `T[]` и пару объектов) вместо этого.

Если вы хотите создать шаблонный тест, который можно настроить с помощью параметров, вам следует использовать атрибут `InlineData`.

Вот пример, который объясняет, как создать шаблонный тест с параметрами:

```csharp
[Theory]
[InlineData(3)]
[InlineData(5)]
public void MyTest(int value)
{
    // Ваш код теста с использованием параметра value
}
```

В этом примере `MyTest` метод будет запущен два раза: первый раз с параметром `value = 3`, второй раз с параметром `value = 5`.

Чтобы сделать более сложные примеры, вы можете использовать объекты вместо примитивных типов данных:

```csharp
public class MyData
{
    public string Name { get; set; }
    public int Value { get; set; }
}

[Theory]
[InlineData("test1", 3)]
[InlineData("test2", 5)]
public void MyTest(string name, int value)
{
    // Ваш код теста с использованием параметров name и value
    // Вы также можете создать экземпляр MyData тут, используя переданные параметры
}
```

Не забудьте добавить ссылку на `xunit.framework` в ваш проект, если вы используете фреймворк для тестирования xUnit.net. Если вы используете другой фреймворк, убедитесь, что вы добавили соответствующую ссылку.

Это должно помочь вам создать шаблонный тест с параметрами в C#. Если вы все еще получаете исключение "Exception has been thrown by the target of an invocation", пожалуйста, предоставьте больше информации об ошибке или коде, чтобы можно было дать более точный ответ.
Похожие вопросы