当参数实现通用接口

时间:2016-03-03 13:36:20

标签: c# unit-testing generics 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能够通过指定here的通用测试夹具来实现这一目标。我写了以下内容([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 个答案:

答案 0 :(得分:2)

试试这个:

[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);
    }
}