使用moq模拟具有泛型参数的类型
本文关键字:参数 类型 泛型 moq 模拟 使用 | 更新日期: 2023-09-27 18:29:26
我有以下接口。由于T是泛型的,我不确定如何使用Moq来模拟IRepository。我相信有办法,但我没有通过搜索这里或谷歌找到任何东西。有人知道我怎样才能做到这一点吗?
我是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();
}
根本不应该是个问题:
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();
}
}
我在测试中创建了一个伪混凝土类,或者使用现有的Entity类型。
也许可以在不创建具体类的情况下完成100个环,但我认为这不值得。
您必须指定类型,据我所知,没有直接返回泛型类型项的方法。
mock = new Mock<IRepository<string>>();
mock.Setup(x => x.FindAll()).Returns("abc");