2015-04-14 5 views
1

Я достаточно опытен, когда насмехаются в интерфейсах, и это первый раз, когда я пытаюсь имитировать общие абстрактные классы. Я обновляю код, над которым работал предыдущий разработчик, и уже ушел в отставку. Я пытаюсь издеваться общий абстрактный класс, используя MOQ, код, как показано нижеКак насмехаться с общим абстрактным классом с помощью MOQ?

public abstract class AbstractView<TView, TTranslation, TProperty, TPropertyView> : TranslatableEntity<TTranslation>, IView 
     where TView : IView, new() 
     where TTranslation : ITranslation 
     where TProperty : BaseEntity, IProp 
     where TPropertyView : AbstractPropertyView<TView,TProperty>, new() 
    { 

Я видел этот здесь, в StackOverflow, но когда я попробовал это не кажется, что работать

StackOverflow Solution

Im получает неправильное количество ошибок параметров типа при попытке выполнить описанное выше.

Я спросил некоторых людей здесь, и они также не имеют понятия. Может ли кто-нибудь научить меня, как я могу издеваться над таким абстрактным классом?

Заранее спасибо

+1

Что делает код насмешливый вы пытались посмотреть например, и какую ошибку вы на самом деле получаете? – forsvarir

ответ

0

Ну, ты не показал свой реальный код насмешливый, но вы можете издеваться этот класс просто отлично.

Вот пример. Учитывая следующие интерфейсы/классы: (?)

общедоступный интерфейс IView {}

class DummyView : IView { } 
public interface ITranslation { } 
public interface IProp { } 
public class BaseEntity : IProp {} 
public class AbstractPropertyView<TView,TProperty> { } 
public abstract class TranslatableEntity<TTranslation> { } 

public abstract class AbstractView<TView, TTranslation, TProperty, TPropertyView> : TranslatableEntity<TTranslation>, IView 
     where TView : IView, new() 
     where TTranslation : ITranslation 
     where TProperty : BaseEntity, IProp 
     where TPropertyView : AbstractPropertyView<TView,TProperty>, new() 
{ 
    public abstract int Foo(); 
} 

вы можете издеваться это так просто, как:

var mock = new Mock<AbstractView<DummyView, ITranslation, BaseEntity, AbstractPropertyView<DummyView, BaseEntity>>>(); 
mock.Setup(m => m.Foo()).Returns(5); 
+0

Я думаю, что im, наконец, получив смысл, когда насмехаются абстрактные классы, вам нужно передать конкретные классы в типы, где должен быть предоставлен «тип с пустым конструктором» и просто предоставить интерфейсы с помощью ... хороших интерфейсов, я прав? – user1465073

+0

@ user1465073 Да, ограничение 'new()' требует, чтобы вы предоставили тип, который должен иметь открытый конструктор без параметров. Это не имеет никакого отношения к тому факту, что вы издеваетесь над абстрактным классом. То же самое, если вы должны указать параметр типа где-либо еще.У вас нужно заполнить ограничения.Если вы используете интерфейс или конкретный класс для других параметров типа, это не имеет значения (это зависит от вас и вашего прецедента, вы можете использовать оба). – sloth

+0

я вижу, это имеет смысл и да, я получал ошибку чего-то вроде «должен передать объект с пустым конструктором», и я был настолько укорочен t Когда я создаю макет, я использую конкретные классы. благодарит La – user1465073

Смежные вопросы