C#:最小起订量:消息:System.NotSupportedException:不支持的表达式:项目 => item.RouteId 不可覆盖的成员

C#: Moq : Message: System.NotSupportedException : Unsupported expression: item => item.RouteId Non-overridable members

我有一个接口Arbiter:

public interface Arbiter
{
    ContextData GetContextData();
}

我有一个 class 实现了这个接口:

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

     public ContextData GetContextData()
     {
          return m_data;
     }
}

我有另一个使用此接口的 class:

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

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

现在我想对此进行单元测试 class:

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 中使用 class 吗?

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; }     
}

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

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