4

假设我有一个接口 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 中有一系列 Property Get/Sets,我试图伪造/模拟这些值。

但是我无法开始对这个抽象类进行正确的模拟

希望这是有道理的

4

1 回答 1

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);

但请注意,您的所有属性都必须是virtualor abstract

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

public class StubReportBuilder : ReportBuilder<Report>
{
    public override Int32 SomeThing { get { return 42; } set { } }
}
于 2013-03-01T07:33:39.567 回答