【问题标题】:Why Moq.SetupGet throws NotSuportedException为什么 Moq.SetupGet 抛出 NotSuportedException
【发布时间】:2020-02-01 13:42:04
【问题描述】:

Moq.SetupGet 抛出异常。

为什么?

如果我没有办法如何正确执行,如何更改测试的类(我无法添加接口或使属性虚拟或类似的东西)

public class ToDelete
{
    public int ToDeleteProperty
    {
        get;
        set;
    }
}

测试

[TestMethod]
public void PutCaseByIdCaseContactsExperimental()
{
    var toDelete = new Mock<ToDelete>();
    toDelete.SetupGet(x => x.ToDeleteProperty).Returns(5); //<------throws exception below

    Assert.AreEqual(toDelete.Object.ToDeleteProperty, 5);
 }

结果堆栈跟踪:v Moq.Guard.IsOverridable(MethodInfo 方法, 表达式表达式) v Moq.InvocationShape..ctor(LambdaExpression 表达式、MethodInfo 方法、IReadOnlyList'1 个参数)v Moq.ExpressionExtensions.g__Split|4_1(表达式 e, 表达式& r, InvocationShape& p) v Moq.ExpressionExtensions.Split(LambdaExpression 表达式) v Moq.Mock.Setup(Mock mock, LambdaExpression 表达式, Condition 条件) v Moq.Mock.SetupGet(Mock mock, LambdaExpression 表达式,条件条件)v Moq.Mock1.SetupGet[TProperty](Expression1 表达式)v Cnx.Csm.CaseManagement.Test.Controllers.CaseControllerTest.PutCaseByIdCaseContactsExperimental() v C:\tfs____Test.cs:line 682 结果消息:测试方法 ____________________Test.________________抛出异常:System.NotSupportedException:不支持的表达式:x => x.ToDeleteProperty 不可覆盖的成员(这里: CaseControllerTest.ToDelete.get_ToDeleteProperty) 不能用于 设置/验证表达式。

【问题讨论】:

  • 你不必模拟ToDeleteProperty。尝试构造一个具体对象并将值设置为5,就像在非测试代码中所做的那样。
  • 为什么要在这里使用mock?只是为了测试目的而构建对象的实例?或者通过 SetupAllProperties 使用存根...

标签: c# unit-testing moq


【解决方案1】:

您正在尝试模拟非虚拟类型。

基本上,Moq 创建了一个代理,该代理实现、继承自应模拟的类型并用它自己的属性和方法覆盖。

通常,Moq 即将为abstract 类型提供测试实现,例如基类和接口,它们不能或不应该在测试中使用(为了设计或简单性)。

当你像这样声明你的属性时,你可以让你的场景工作:

public virtual int ToDeleteProperty

虽然我不建议以这种方式改变你的班级。

【讨论】:

    猜你喜欢
    • 2016-04-04
    • 2021-12-20
    • 2011-01-02
    • 2021-03-05
    • 2021-03-19
    • 2014-01-24
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多