我试图在一个MVC项目的解决方案中概括一些测试代码。因为我们正在为每个控制器编写相同的测试,我的想法是我可以使用泛型来制作它,所以只需要进行一次测试。
很遗憾,我目前收到错误:Error 1 The type 'TRepo' must be a reference type in order to use it as parameter 'T' in the generic type or method 'Moq.Mock<T>'
这是相关代码。如果需要,我可以提供更多。
TestBase.cs
public class TestBase<TController, TObject, TRepo>
where TController : IRMCController<TObject>
where TRepo : IRMCRepository
{
public Mock<TRepo> Repo { get; set; }
}
CompaniesTest.cs
public class CompaniesTest : TestBase<CompaniesController, Company, ICompanyRepository>
感谢您的帮助。
答案 0 :(得分:5)
在Moq中,Mock<T>
类对其泛型类型有class
约束。以下是它的定义:
public class Mock<T> : Mock where T : class
因此,如果您打算在班级中使用此功能,除了class
之外,您还必须定义相同的IRMCRepository
约束:
public class TestBase<TController, TObject, TRepo>
where TController : IRMCController<TObject>
where TRepo : class, IRMCRepository
{
public Mock<TRepo> Repo { get; set; }
}
现在你的代码会编译。这是C#中的基本generic constraints
。