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" });
我有一个接口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" });