为Mock提供泛型

本文关键字:泛型 Mock | 更新日期: 2023-09-27 18:10:01

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

谢谢你的帮助。

为Mock提供泛型

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

public class Mock<T> : Mock where T : class

因此,如果您打算在类中使用它,那么除了IRMCRepository:之外,还必须定义相同的class约束

public class TestBase<TController, TObject, TRepo>
    where TController : IRMCController<TObject>
    where TRepo : class, IRMCRepository
{
    public Mock<TRepo> Repo { get; set; }
}

现在你的代码要编译了。这是C#中的基本generic constraints