为模拟提供通用

时间:2013-04-19 20:17:07

标签: c# asp.net-mvc generics moq

我试图在一个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>

感谢您的帮助。

1 个答案:

答案 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