使用 moq 模拟虚拟只读属性

Posted

技术标签:

【中文标题】使用 moq 模拟虚拟只读属性【英文标题】:Mocking virtual readonly properties with moq 【发布时间】:2010-11-30 01:32:36 【问题描述】:

我找不到这样做的方法,虽然这可以手动完成,所以为什么不使用 moq 呢?

【问题讨论】:

【参考方案1】:

您需要确保属性是虚拟的才能完成这项工作。

【讨论】:

当回答一个已被接受的旧问题时,请尝试给出一个答案,该答案要么添加新内容,要么对它有帮助。由于您当前的答案现在是评论而不是答案。除了说明需要确保什么才能工作之外,通常还包括一个关于如何做到这一点的具体示例会更有帮助。另请参阅contribution guide 以供参考。【参考方案2】:

给定这个类

public abstract class MyAbstraction

    public virtual string Foo
    
        get  return "foo"; 
    

您可以像这样设置 Foo(只读属性):

var stub = new Mock<MyAbstraction>();
stub.SetupGet(x => x.Foo).Returns("bar");

stub.Object.Foo 现在将返回“bar”而不是“foo”。

【讨论】:

优秀的答案谢谢。换句话说,最好不要只使用 getter 属性,因为它们很难模拟? 你看我有一堆只读属性:drive.google.com/file/d/0ByqKtGmtuLzZNFhwTWhMMGVRZnc/… 我正在尝试使用它们的父类作为被测系统,所以我不确定我将如何设置最小起订量,因为被测系统不是模拟类,而我想从这些 getter 中强制一个值 @l--''''''---------'''''''''''''''''''' 一个 get-only 属性只是一个语法糖方法,因此,如果您将该陈述得出其合乎逻辑的结论,您会说最好不要使用返回数据的方法。我一点也不同意。 好点。你能建议我如何将这些吸气剂注入一个具体的(非模拟)类吗? 抱歉,如果我没有多大意义,那是问题的一部分,我只需要一种方式来表达/描述这一点

以上是关于使用 moq 模拟虚拟只读属性的主要内容,如果未能解决你的问题,请参考以下文章

使用 Moq 模拟类时,如何仅针对特定方法进行 CallBase?

如何使用 MOQ 框架在 c# 中模拟静态方法?

Moq,SetupGet,模拟属性

IIS的虚拟目录的只读属性去不掉

模拟 EF 核心 dbcontext 和 dbset

如何使用 moq 模拟 ConfigurationManager.AppSettings