Search code examples
c#unit-testingnunitmoq

Nunit Moq: Unsupported expression: Value Non-overridable members may not be used in setup / verification expressions


I writing unit test for a function and for that I need to mock an entity. This is how I'm trying to mock:

Mock<ISimpleData> data = new Mock<ISimpleData>();
data.Setup(i => i.RiskId.Value).Returns("123");//gets error here

RiskId is of type StringData : DataGeneric<string>. From the error, it appears that Moq dll is unable to fetch RiskId.Value because of the data type of RiskId.

Is there any way I can still mock RiskId.Value attribute as this is being used in the function for which I'm writing the test. Following is the error:

System.NotSupportedException: Unsupported expression: ... => ....Value Non-overridable members (here: DataGeneric.get_Value) may not be used in setup / verification expressions. at Moq.Guard.IsOverridable(MethodInfo method, Expression expression) in C:\projects\moq4\src\Moq\Guard.cs:line 99 at Moq.InvocationShape..ctor(LambdaExpression expression, MethodInfo method, IReadOnlyList'1 arguments, Boolean exactGenericTypeArguments, Boolean skipMatcherInitialization, Boolean allowNonOverridable) in C:\projects\moq4\src\Moq\InvocationShape.cs:line 84 at Moq.ExpressionExtensions.g__Split|5_0(Expression e, Expression& r, InvocationShape& p, Boolean assignment, Boolean allowNonOverridableLastProperty) in C:\projects\moq4\src\Moq\ExpressionExtensions.cs:line 324 at Moq.ExpressionExtensions.Split(LambdaExpression expression, Boolean allowNonOverridableLastProperty) in C:\projects\moq4\src\Moq\ExpressionExtensions.cs:line 149 at Moq.Mock.Setup(Mock mock, LambdaExpression expression, Condition condition) in C:\projects\moq4\src\Moq\Mock.cs:line 505 at Moq.Mock`1.Setup[TResult](Expression'1 expression) in C:\projects\moq4\src\Moq\Mock'1.cs:line 454 System.Exception {System.NotSupportedException


Solution

  • I'm unaware of any built-in DataGeneric class, so I assume it is a user-defined class.

    The error says

    ... Value Non-overridable members (here: DataGeneric.get_Value) ...

    which means you should not mock the RiskId.Value.

    You should try to setup a mock for the RiskId itself:

    data.Setup(i => i.RiskId).Returns(new StringData("123"));
    

    I've assumed your StringData has a constructor which can receive its value.