如何模拟Generic Abstract类

时间:2013-02-28 19:06:26

标签: moq

假设我有一个接口IReportBuilderService和具体的类ReportBuilderService

e.g. public class ReportBuilderService : IReportBuilderService { }

我可以开始使用Moq来模拟这项服务

Mock<IReportBuilderService> _reportBuilderServiceMock = new Mock<IReportBuilderService>();

在模拟类上模拟期望等,没问题。

问题:如何模拟以下方法签名?

public abstract class ReportBuilder<TReport> where TReport : Report, new()

其中TReport定义为

public class SomeReport : ReportBuilder<Report>, IMapper{}

报告类只是

public class Report { }

在抽象类ReportBuilder中有一系列属性获取/集合,这是我试图伪造/模拟的值。

但是我不能开始在这个抽象类中使用

开始正确的模拟

希望这是有道理的

1 个答案:

答案 0 :(得分:1)

鉴于您的抽象类看起来像这样:

public abstract class ReportBuilder<TReport> where TReport : Report, new() 
{
    public abstract Int32 SomeThing { get; set; }
}

嘲笑它没有问题:

var m = new Mock<ReportBuilder<Report>>();
m.SetupProperty(r => r.SomeThing, 19);

但请注意,您的所有媒体资源必须为virtualabstract

所以如果不是这种情况(并且你不能或不想改变它),你可以从基类中提取interface并使用它(如果你愿意相应地更改你的代码),或者只是通过子类化创建一个存根/模拟:

public class StubReportBuilder : ReportBuilder<Report>
{
    public override Int32 SomeThing { get { return 42; } set { } }
}