Используйте moq для макетирования типа с универсальным параметром - PullRequest
9 голосов
/ 29 марта 2012

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

Я довольно новичок в 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();
    }

Ответы [ 3 ]

13 голосов
/ 29 марта 2012

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

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 голосов
/ 29 марта 2012

Я создаю фиктивный конкретный класс в своих тестах - или использую существующий тип сущности.

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

2 голосов
/ 29 марта 2012

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

mock = new Mock<IRepository<string>>();    
mock.Setup(x => x.FindAll()).Returns("abc");
...