2013-02-28 68 views
3

假設我有一個接口IReportBuilderService和具體類ReportBuilderService如何嘲笑通用抽象類

e.g. public class ReportBuilderService : IReportBuilderService { } 

我可以開始使用起訂量來模擬這種服務本身

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

和模擬預期等因素對模擬課,好吧沒問題。

問題:如何模擬以下方法簽名?

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

其中黎港被定義爲

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

,並報告類只是

public class Report { } 

在抽象類的ReportBuilder有一系列屬性獲取/套,它是這些我試圖僞造/嘲笑的價值。

但我不能開始得到這個抽象類的正確模擬下手

希望這是有道理

回答

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 { } } 
} 
+0

Thanks Dominic:是的,這是缺乏虛擬屬性,趕上了我 – Rory 2013-03-01 17:38:16