首页 > 解决方案 > 如果我向类添加通用约束,则无法识别单元测试

问题描述

我想为我的单元测试类添加一个通用约束

public class CacheOperationsUnitTests<T>
{
    private ITCache<T> ICacheStore;
    static readonly IUnityContainer container = new UnityContainer();
    static CacheOperationsUnitTests()
    {
        container.RegisterType(typeof(ITCache<>), typeof(TRedisCacheStore<>), (new ContainerControlledLifetimeManager()));
    }

    public CacheOperationsUnitTests()
    {
        ICacheStore = container.Resolve<TRedisCacheStore<T>>();

    }

但是当我这样做时,测试资源管理器中无法识别我的单元测试,当我尝试运行单元测试时,我会在下面看到:

F:\projects\Development VSTO\TRF Dev ( Performance) New\Perf\SSRProd\Caching.UnitTests\bin\Debug\Caching.UnitTests.dll 中没有可用的测试。确保测试发现者和执行者已注册并且平台和框架版本设置正确,然后重试。**

<T>当我从类名中删除时工作正常,但我需要<T> ,因为我需要它们在我的代码中:

private ITCache<T> ICacheStore;

标签: c#asp.net-mvcvisual-studiovs-unit-testing-framework

解决方案


伤害你的不是一般约束;通用约束是 " where T : SomeWhatever" 部分 - 你没有那个。在这里伤害你的是泛型类型参数的添加——即泛型本身。

想象一下,你是一名测试跑步者。你可以看到一个

public class SomeTests<T> {}

具有看起来像测试的公共方法。现在; 你如何创建一个实例?你选择什么T?你不能创建一个开放的泛型类型的实例——你需要一个具体的类型,比如SomeTests<Bar>(对于某些类型Bar)。

一种选择可能是:

public abstract class CacheOperationsUnitTests<T>
public class FooCacheOperationsUnitTests : CacheOperationsUnitTests<Foo>
public class BarCacheOperationsUnitTests : CacheOperationsUnitTests<Bar>
// plus whatever other T you need

但是,我强烈怀疑您可以简单地从测试中删除泛型,并使用特定的具体类型代替T.


推荐阅读