假设我有一个接口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中有一系列属性获取/集合,这是我试图伪造/模拟的值。
但是我不能开始在这个抽象类中使用
开始正确的模拟希望这是有道理的
答案 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);
但请注意,您的所有媒体资源必须为virtual
或abstract
。
所以如果不是这种情况(并且你不能或不想改变它),你可以从基类中提取interface
并使用它(如果你愿意相应地更改你的代码),或者只是通过子类化创建一个存根/模拟:
public class StubReportBuilder : ReportBuilder<Report>
{
public override Int32 SomeThing { get { return 42; } set { } }
}