我为一个函数编写单元测试,为此我需要模拟一个实体。这就是我试图嘲笑的方式:
Mock<ISimpleData> data = new Mock<ISimpleData>();
data.Setup(i => i.RiskId.Value).Returns("123");//gets error here
RiskId
的类型为StringData : DataGeneric<string>
。从错误来看,由于RiskId
的数据类型,Moq dll似乎无法获取RiskId.Value
。
是否有任何方法我仍然可以模拟RiskId.Value
属性,因为这是在我正在编写测试的函数中使用的。下面是错误:
系统。NotSupportedException: Unsupported expression:…=比;价值……不可重写的成员(这里:DataGeneric.get_Value)不能在设置/验证表达式中使用。在Moq.Guard。IsOverridable(MethodInfo方法,Expression表达式)在C:projectsmoq4srcMoqGuard.cs:第99行在Moq.InvocationShape . .C:projectsmoq4srcMoqInvocationShape.cs:第84行。(LambdaExpression表达式,MethodInfo方法,IReadOnlyList'1参数,Boolean exactGenericTypeArguments, Boolean skipMatcherInitialization, Boolean allowNonOverridable在Moq.ExpressionExtensions。__split |5_0(表达式e,表达式&r, InvocationShape&p,布尔赋值,布尔allowNonOverridableLastProperty)在C:projectsmoq4srcMoqExpressionExtensions.cs:行324在Moq.ExpressionExtensions。分割(LambdaExpression表达式,布尔allowNonOverridableLastProperty)在C:projectsmoq4srcMoqExpressionExtensions.cs:第149行在Moq.Mock。设置(模拟模拟,LambdaExpression表达式,条件条件)在C:projectsmoq4srcMoqMock.cs: 505行在Moq.Mock 1。设置[结果](表达式'1表达式)在C:projectsmoq4srcMoqMock'1.cs:行454系统。异常{系统。NotSupportedException
由于
我不知道任何内置的DataGeneric
类,所以我假设它是一个用户定义的类。
错误提示
…
值不可重写的成员(这里:DataGeneric.get_Value)…
这意味着您不应该模仿RiskId.Value
。
您应该尝试为RiskId
本身设置一个模拟:
data.Setup(i => i.RiskId).Returns(new StringData("123"));
我假设你的StringData
有一个构造函数可以接收它的值。
是的,您可以像这样实现自己的ISimpleData
实现:
public class MyTests
{
[Test]
public void MyTest()
{
// Arrange
var data = new SimpleDataMock("123");
// Act
// ...
// Assert
// ...
}
private class SimpleDataMock : ISimpleData
{
public SimpleDataMock(string riskValue) => this.RiskId.Value = riskValue;
// ...
}
}