Параметрический тест с универсальными методами - PullRequest
11 голосов
/ 29 апреля 2009

В NUnit 2.5 вы можете сделать это:

[TestCase(1,5,7)]
public void TestRowTest(int i, int j, int k)
{
  Assert.AreEqual(13, i+j+k);
}

Вы можете сделать параметрический тест.

Но мне интересно, можете ли вы сделать это или нет, параметрический тест с общим методом теста? I.e.:

[TestCase <int>("Message")]
public void TestRowTestGeneric<T>(string msg)
{
  Assert.AreEqual(5, ConvertStrToGenericParameter<T>(msg));
}

или что-то подобное.

Ответы [ 3 ]

22 голосов
/ 07 июня 2009

Вот цитата из заметки о выпуске NUnit 2.5 текст ссылки

Параметризованные методы испытаний могут быть родовой. NUnit выведет правильный реализация использовать на основе типы предоставленных параметров. Общие методы испытаний поддерживаются в и общие и неуниверсальные предложения.

В соответствии с этим возможно использование универсального метода тестирования в неуниверсальном классе. Как?

Я не совсем понимаю комментарий Джеффа. В .net generics используется как во время компиляции, так и во время выполнения. Мы можем использовать отражение, чтобы узнать атрибут тестового случая, связанный с методом, найти универсальный параметр и снова использовать рефлексию для вызова универсального метода. Это будет работать, нет?

Обновление: хорошо, теперь я знаю, как и надеюсь, что еще не слишком поздно. Вам нужно, чтобы универсальный тип был в списке параметров. Например:

[TestCase((int)5, "5")]
[TestCase((double)2.3, "2.3")]
public void TestRowTestGeneric<T>(T value, string msg)
{
  Assert.AreEqual(value, ConvertStrToGenericParameter<T>(msg));
}
4 голосов
/ 15 ноября 2016

Вы можете сделать собственный GenericTestCaseAttribute

    [Test]
    [GenericTestCase(typeof(MyClass) ,"Some response", TestName = "Test1")]
    [GenericTestCase(typeof(MyClass1) ,"Some response", TestName = "Test2")]
    public void MapWithInitTest<T>(string expectedResponse)
    {
        // Arrange

        // Act
        var response = MyClassUnderTest.MyMethod<T>();

        // Assert
        Assert.AreEqual(expectedResponse, response);
    }

Вот реализация GenericTestCaseAttribute

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class GenericTestCaseAttribute : TestCaseAttribute, ITestBuilder
{
    private readonly Type _type;
    public GenericTestCaseAttribute(Type type, params object[] arguments) : base(arguments)
    {
        _type = type;
    }

    IEnumerable<TestMethod> ITestBuilder.BuildFrom(IMethodInfo method, Test suite)
    {
        if (method.IsGenericMethodDefinition && _type != null)
        {
            var gm = method.MakeGenericMethod(_type);
            return BuildFrom(gm, suite);
        }
        return BuildFrom(method, suite);
    }
}
1 голос
/ 24 мая 2011

Создайте приватный метод и вызовите его:

    [Test]
    public void TypeATest()
    {
        MyTest<TypeA>();
    }

    [Test]
    public void TypeBTest()
    {
        MyTest<TypeB>();
    }

    private void MyTest<T>()
    {
        // do test.
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...