2012-03-29 3 views
7

У меня есть следующие интерфейсы. Я не уверен, как я могу использовать Moq для макетирования IRepository из-за того, что T является общим. Я уверен, что есть способ, но я ничего не нашел, просматривая здесь или в Google. Кто-нибудь знает, как я могу это достичь?Использовать moq для определения типа с общим параметром

Я довольно новичок в Moq, но вижу, что вам нужно время, чтобы изучить его.

/// <summary> 
    /// This is a marker interface that indicates that an 
    /// Entity is an Aggregate Root. 
    /// </summary> 
    public interface IAggregateRoot 
    { 
    } 


/// <summary> 
    /// Contract for Repositories. Entities that have repositories 
    /// must be of type IAggregateRoot as only aggregate roots 
    /// should have a repository in DDD. 
    /// </summary> 
    /// <typeparam name="T"></typeparam> 
    public interface IRepository<T> where T : IAggregateRoot 
    { 
     T FindBy(int id); 
     IList<T> FindAll(); 
     void Add(T item); 
     void Remove(T item); 
     void Remove(int id); 
     void Update(T item); 
     void Commit(); 
     void RollbackAllChanges(); 
    } 

ответ

11

не должно быть проблемой вообще:

public interface IAggregateRoot { } 

class Test : IAggregateRoot { } 

public interface IRepository<T> where T : IAggregateRoot 
{ 
    // ... 
    IList<T> FindAll(); 
    void Add(T item); 
    // ... 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     // create Mock 
     var m = new Moq.Mock<IRepository<Test>>(); 

     // some examples 
     m.Setup(r => r.Add(Moq.It.IsAny<Test>())); 
     m.Setup(r => r.FindAll()).Returns(new List<Test>()); 
     m.VerifyAll(); 
    } 
} 
3

В моих тестах я создаю класс фиктивного конкретного класса или использую существующий тип Entity.

Возможно, это будет возможно, пройдя 100 обручей без создания конкретного класса, но я не думаю, что это того стоит.

2

Вы должны указать типы, насколько я знаю, нет прямого способа возврата типичных типизированных элементов.

mock = new Mock<IRepository<string>>();  
mock.Setup(x => x.FindAll()).Returns("abc"); 
Смежные вопросы