我是新来莫克的.我在嘲笑一个PagingOptions级的学生.下面是班级的外观:

public class PagingOptions
    {
        [Range(1, 99999, ErrorMessage = "Offset must be greater than 0.")]
        public int? Offset { get; set; }

        [Range(1, 100, ErrorMessage = "Limit must be greater than 0 and less than 100.")]
        public int? Limit { get; set; }

        public PagingOptions Replace(PagingOptions newer)
        {
            return new PagingOptions
            {
                Offset = newer.Offset ?? Offset,
                Limit = newer.Limit ?? Limit
            };
        }
    }

这是我的模拟版本,

var mockPagingOptions = new Mock<PagingOptions>();
            mockPagingOptions.Setup(po => po.Limit).Returns(25);
            mockPagingOptions.Setup(po => po.Offset).Returns(0);

设置属性值时出现以下错误.我是不是做错了什么.看来我不能上混凝土课了?只有接口可以被嘲笑吗?请协助.

moq error

谢谢

推荐答案

Moq创建模拟类型的实现.如果类型是接口,它将创建一个实现该接口的类.如果类型是一个类,它将创建一个继承类,该继承类的成员将调用基类.但为了做到这一点,它必须凌驾于成员之上.如果一个类的成员不能被重写(它们不是虚拟的、抽象的),那么Moq就不能重写它们来添加自己的行为.

在这种情况下,没有必要模仿PagingOptions,因为它很容易使用一个真正的.而不是这个:

var mockPagingOptions = new Mock<PagingOptions>();
mockPagingOptions.Setup(po => po.Limit).Returns(25);
mockPagingOptions.Setup(po => po.Offset).Returns(0);

这样做:

var pagingOptions = new PagingOptions { Limit = 25, Offset = 0 };

我们如何决定是否嘲笑某件事呢?一般来说,如果我们不想在测试中包含具体的运行时实现,我们会嘲笑一些东西.我们希望测试一个类,而不是同时测试两个类.

但在本例中,PagingOptions只是一个包含一些数据的类.嘲笑它真的没有意义.使用真品同样容易.

.net相关问答推荐

在平板电脑上运行我的 Angular 13 和 .Net Api 项目时,它不会向 api 输入请求

Visual Studio 2022 中的目标操作系统和目标运行时有什么区别?

为什么这个同步运行的异步睡眠会挂起?

如何在 Raspberry Pi 上托管 WASM 文件?

使用 SSH.NET 查找具有特定文件名的最新 SFTP 文件

将 Moq 模拟对象传递给构造函数

在 C# 中输入按键

从 byte[] 创建 zip 文件

为什么 SortedSet.GetViewBetween 不是 O(log N)?

哪个单元测试框架?

Linq查询分组并 Select 第一个项目

属性应该与其类型同名吗?

什么是 Hashtable 的通用版本?

是否有可用的 WPF 备忘单?

什么是 ToString("N0") 格式?

.NET 配置文件 configSource 在应用程序目录文件夹之外

更改 SqlConnection 超时

说明 C# 中 volatile 关键字的用法

无锁多线程适用于真正的线程专家

从不同程序集中的类名中解析类型