为模拟提供通用

Cod*_*ula 3 c# generics asp.net-mvc 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; }
}
Run Code Online (Sandbox Code Playgroud)

CompaniesTest.cs

public class CompaniesTest : TestBase<CompaniesController, Company, ICompanyRepository>
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

Dar*_*rov 5

在Moq中,Mock<T>class对其泛型类型有约束.以下是它的定义:

public class Mock<T> : Mock where T : class
Run Code Online (Sandbox Code Playgroud)

所以如果你打算在你的类中使用它,你必须定义相同的class约束除了IRMCRepository:

public class TestBase<TController, TObject, TRepo>
    where TController : IRMCController<TObject>
    where TRepo : class, IRMCRepository

{
    public Mock<TRepo> Repo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在你的代码将编译.这是generic constraintsC#的基础.