2013-02-28 2 views
3

Предполагая, что у меня есть интерфейс IReportBuilderService и бетон класса ReportBuilderServiceКак издеваются в Generic Абстрактный класс

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

И Report класс просто

public class Report { } 

В абстрактном классе ReportBuilder Есть ряд Property Get/Sets, это ценность, которую я пытаюсь подделать/издеваться.

Но я не могу начать, чтобы получить правильный макет на этом абстрактном классе, чтобы начать с

Надеются, что это имеет смысл

ответ

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 и использовать его (если вы хотите изменить свой код соответственно), или просто создать stub/mock путем подкласса:

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

Спасибо Доминик: Да, это было отсутствие виртуальных свойств, которые меня ловили – Rory