我有一个数据访问界面,大致如下所示:
public interface IDataRepository
{
DatabaseResult<Customer> GetAllCustomers();
DatabaseResult<Report> GetAllReports();
DatabaseResult<Order> GetAllOrders();
[..] (there are many methods like this)
}
DatabaseResult
是一个public class
,用于在返回的信息中附加一些元数据。
当我模拟这个接口时,我希望每个方法(我可能有 > 100 个)都返回
DatabaseResult<WhatEverType>
的实例。目前我需要为每种类型调用SetReturnsDefault
,例如
var mockDb = new Mock<IDataProvider>();
mockDb.SetReturnsDefault(new DatabaseResult<Customer>());
mockDb.SetReturnsDefault(new DatabaseResult<Report>());
mockDb.SetReturnsDefault(new DatabaseResult<Order>());
有没有办法告诉 Moq,当方法的返回类型为
DatabaseResult<SomeType>
时,无论 DatabaseResult<SomeType>
是什么,总是返回一个新实例 SomeType
?
或者更一般地说,如果返回类型是类/记录/结构,有一种方法可以告诉 Moq 始终返回一个新实例?对于常见的通用集合接口,如
IEnumerable<T>
、IList<T>
、IDictionary<T>
,[..] 只返回实现该接口的随机 .NET 类型?
听起来你想要的是这样的:
var mock = new Mock<IDataRepository> {
DefaultValue = DefaultValue.Mock
};
来自源代码的评论:
/// <summary>
/// Whenever the default value generated by <see cref="Empty"/>
/// is null, replaces this value with a mock (if the type
/// can be mocked).
/// </summary>
/// <remarks>
/// For sealed classes, a null value will be generated.
/// </remarks>
Mock,