是否有在 Moq 中使用 SetReturnsDefault 的通用方法

问题描述 投票:0回答:1

我有一个数据访问界面,大致如下所示:

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 类型?

c# unit-testing moq
1个回答
0
投票

听起来你想要的是这样的:

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,
© www.soinside.com 2019 - 2024. All rights reserved.