NUnit Универсальное тестовое устройство не отображается, когда параметр реализует универсальный интерфейс

У меня есть интерфейс, определенный так:

public interface ITaskGenerator<T> where T : ITaskRequest
{
    int CreateTask(T request);
}

и реализатор:

public class OrderTaskGenerator : ITaskGenerator<OrderTaskRequest>
{
        public int CreateTask(OrderTaskRequest request)
        {
          ..
        }
}

То, что я хочу сделать, это сделать универсальное тестовое устройство, используя NUnit, что я могу просто указать все реализации ITaskGenerator<ITaskRequest> интерфейс, чтобы запустить контрактные тесты для всех из них.

К счастью, NUnit имеет возможность сделать это с помощью общего тестового приспособления, указанного здесь. Я написал следующее ([TestFixture(typeof(OrderTaskGenerator))] Атрибут - это то, что важно для NUnit, чтобы он проходил через правильный тип):

    [TestFixture(typeof(OrderTaskGenerator))]
    public class ITaskGeneratorContract<T> where T : ITaskGenerator<ITaskRequest>, new()
    {

        [Test]
        public void CreateTask_Returns_InvalidException_If_Task_ID_Is_Empty()
        {
          // Test goes here
        }
    }

Тем не менее, это не отображается в Test Explorer. Если я делаю интерфейс не универсальным, это делает.

Так кто-нибудь знает обойти это или есть что-то еще, что я скучаю. Я думаю это потому что ITaskGenerator это общий интерфейс, но я могу ошибаться.

1 ответ

Решение

Попробуй это:

[TestFixture(typeof(OrderTaskGenerator), typeof(OrderTaskRequest))]
public class TaskGeneratorContractTest<T, TRequest> where T : ITaskGenerator<TRequest>, new() where TRequest : ITaskRequest
{
    private T _sut;

    public TaskGeneratorContractTest()
    {
        _sut = new T();
    }
    [Test]
    public void CreateTask_Returns_InvalidException_If_Task_ID_Is_Empty()
    {
        Assert.IsTrue(true);
    }
}
Другие вопросы по тегам