简体   繁体   English

Mocking 一个惰性接口导致运行时异常

[英]Mocking a lazy interface results in run-time exception

I'm having difficulties while trying to properly mock an arbitrary interface wrapped inside Lazy class.我在尝试正确模拟包裹在 Lazy class 中的任意接口时遇到了困难。

I've tried:我试过了:

[TestClass]
public class MyFooTests
{
    private Mock<Lazy<IFoo>> _lazyFooMock = new Mock<Lazy<IFoo>>();
    private Mock<IFoo> _fooMock = new Mock<IFoo>();
    private MyFoo _service;

    [TestMethod]
    public void FooMethod_HappyPath_ShouldReturn()
    {
        //Arrange
        _fooMock
            .Setup(x => x.DoSomething())
            .Returns(1);

        _lazyFooMock
            .SetupGet(x => x.Value)
            .Returns(_fooMock.Object); // --------> Throws Exception.

        _service = new MyService(_lazyFooMock.Object);
    }
}

public interface IFoo
{
    int DoSomething();
}

public class MyFoo
{
    public MyFoo(IFoo foo) { ... }
}

Exception Message:异常消息:

Unsupported expression: x => x.Value Non-overridable members (here: Lazy.get_Value) may not be used in setup / verification expressions.不支持的表达式:x => x.Value 不可覆盖的成员(此处:Lazy.get_Value)不得用于设置/验证表达式。

Stack Trace:堆栈跟踪:

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.<Split>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.SetupGet(Mock mock, LambdaExpression expression, Condition condition) in C:\projects\moq4\src\Moq\Mock.cs:line 520 at Moq.Mock 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.<Split>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.SetupGet(Mock mock, LambdaExpression expression, Condition condition) in C:\projects\moq4\src\Moq\Mock.cs:line 520 at Moq.Mock 1 arguments, Boolean exactGenericTypeArguments, Boolean skipMatcherInitialization, Boolean allowNonOverridable) in C:\projects\moq4\src\Moq\InvocationShape.cs:line 84 at Moq.ExpressionExtensions.<Split>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.SetupGet(Mock mock, LambdaExpression expression, Condition condition) in C:\projects\moq4\src\Moq\Mock.cs:line 520 at Moq.Mock 1.SetupGet[TProperty](Expression 1 expression) in C:\projects\moq4\src\Moq\Mock 1.cs:line 476 at ** .MyFooTests.FooMethod_HappyPath_ShouldReturn() in C:* **.cs:line 109 1 arguments, Boolean exactGenericTypeArguments, Boolean skipMatcherInitialization, Boolean allowNonOverridable) in C:\projects\moq4\src\Moq\InvocationShape.cs:line 84 at Moq.ExpressionExtensions.<Split>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.SetupGet(Mock mock, LambdaExpression expression, Condition condition) in C:\projects\moq4\src\Moq\Mock.cs:line 520 at Moq.Mock 1.SetupGet[TProperty](表达式1 expression) in C:\projects\moq4\src\Moq\Mock 1.cs:line 476 at ** .MyFooTests.FooMethod_HappyPath_ShouldReturn() in C:* .cs:line 476

Moq: 4.16.1最小起订量:4.16.1

Solved by help of others, I've dumped the _lazyFooMock and replaced it with actual Lazy: _lazyFoo , and initiated it by the help of the overload: public Lazy(Func<T> valueFactory) .在其他人的帮助下解决了,我已经转储_lazyFooMock并用实际的 Lazy: _lazyFoo替换它,并在重载的帮助下启动它: public Lazy(Func<T> valueFactory)

private Mock<IFoo> _fooMock = new Mock<IFoo>();
private Lazy<IFoo> _lazyFoo;

private MyService _service;

[TestMethod]
public void FooMethod_HappyPath_ShouldReturn()
{
    //Arrange
    _fooMock
        .Setup(x => x.DoSomething())
        .Returns(1);

    _lazyFoo = new Lazy<IFoo>(() => _fooMock.Object);

    _service = new MyService(_lazyFoo);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM