【问题标题】:C#: Moq : Message: System.NotSupportedException : Unsupported expression: item => item.RouteId Non-overridable membersC#:起订量:消息:System.NotSupportedException:不支持的表达式:item => item.RouteId 不可覆盖的成员
【发布时间】:2021-05-05 13:35:03
【问题描述】:

我有一个接口Arbiter

public interface Arbiter
{
    ContextData GetContextData();
}

我有一个实现这个接口的类:

public class ContextArbiter : Arbiter
{
   ContextData m_data;
    public ContextArbiter()
        :
        base()
    {
       m_data = new ContextData();
    }

     public ContextData GetContextData()
     {
          return m_data;
     }
}

我有另一个类使用这个接口:

public class SelectData 
{        
        private Arbiter m_Arbiter;
        public SelectData(Arbiter Arbiter)
        {            
            m_Arbiter = Arbiter;
        }

        public string RetrieveId()
        {
            return m_Arbiter.GetContextData().RouteId;            
        }
 }

现在我想对这个类进行单元测试:

public class SelectDataTest : UnitTestBase
{
    private Mock<Arbiter> Arbiter;
    private SelectData SelectData;

    [OneTimeSetUp]
    public void OneTimeSetup()
    {
        Arbiter= new Mock<Arbiter>();
        SelectData = new SelectData(Arbiter.Object);
    }     
}

现在这是我的测试:

[Test]
public void RetrieveRouteId_usingMockArbiter_shouldReturnCorrectRouteId()
{
    var ContextDataMock = new Mock<ContextData>();
    ContextDataMock.Setup(item => item.RouteId).Returns(Convert.ToString(64));
    ContextArbiter.Setup(p => p.GetContextData()).Returns(ContextDataMock.Object);

    Assert.AreEqual(Convert.ToString(64), SelectData.RetrieveRouteId());
}

当我运行测试时,我收到以下错误:

Message: System.NotSupportedException : Unsupported expression: item => item.RouteId
Non-overridable members (here: ContextData.get_RouteId) may not be used in setup / verification expressions.

我做错了什么?这个错误是因为我直接在 Mock 中使用了一个类吗?

var ContextDataMock = new Mock<ContextData>();

而不是接口。这种情况该怎么办?

ContextData 的定义如下所示:

public class ContextData 
{
  public string AgencyId { get; set; }        
  public int VhId { get; set; }
  public string RouteId { get; set; }                
  public int EmployeeId { get; set; }     
}

【问题讨论】:

  • 你没有告诉我们ContextData
  • @KlausGütter - 添加了定义

标签: c# unit-testing moq


【解决方案1】:

由于RouteId不是虚拟的,你不能模拟它。但是由于ContextData 是一个没有行为的简单数据类,所以也没有必要模拟它。你可以这样做:

ContextArbiter.Setup(p => p.GetContextData()).Returns(new ContextData { RouteId = "64" });

【讨论】:

    猜你喜欢
    • 2020-03-16
    • 2021-10-25
    • 2019-11-21
    • 2020-12-27
    • 1970-01-01
    • 2022-06-11
    • 2019-11-16
    • 2010-12-30
    • 2018-02-19
    相关资源
    最近更新 更多