c# - 如果我向类添加通用约束,则无法识别单元测试
问题描述
我想为我的单元测试类添加一个通用约束
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;
解决方案
伤害你的不是一般约束;通用约束是 " 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
.
推荐阅读
- android - 在 Application onCreate 期间 React Native Android Module 调用库
- python - 如何同时使用 Spyder 和 PyCharm /Git
- c++ - CMake:未定义对 img_LOAD 的引用,同时找到库
- c++ - 如何在 GTK C++ 中使子小部件可滚动?
- javascript - 格式化日期不从字符串分配新数据
- html - 屏幕阅读器在阅读下一个元素标签后阅读错误消息
- c++ - 如何在主函数中添加f1、f2和f3(tree void函数的三个输出)?
- r - 如何使用来自服务器的信息填充闪亮的输入选项
- javascript - Javascript 循环下拉选项
- php - 雄辩的 WHERE IN 使用原始查询/胶囊管理器