【问题标题】:Mocking a lazy interface results in run-time exception模拟惰性接口会导致运行时异常
【发布时间】:2022-01-12 08:53:42
【问题描述】:

我在尝试正确模拟封装在 Lazy 类中的任意接口时遇到了困难。

我试过了:

[TestClass]
public class MyFooServiceTests
{
    private Mock<Lazy<IFoo>> _lazyFooMock = new Mock<Lazy<IFoo>>();
    private Mock<IFoo> _fooMock = new Mock<IFoo>();
    private MyFooService _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 MyFooService
{
    public MyFooService(IFoo foo) { ... }
}

异常消息:

不支持的表达式:x => x.Value 不可覆盖的成员(此处:Lazy.get_Value)不得用于设置/验证表达式。

起订量:4.16.1

【问题讨论】:

  • 您不能在使用 Moq 时模拟非虚拟成员。 Lazy&lt;T&gt;.Value 不是虚拟的,因此无法模拟。
  • 你为什么要模拟Lazy&lt;T&gt;?只需创建一个新的Lazy&lt;IFoo&gt;,它会返回_fooMock.Object
  • 大家好,谢谢你的提示,看看答案

标签: c# unit-testing moq .net-4.6.2


【解决方案1】:

在其他人的帮助下解决了,我已将 _lazyFooMock 转储为实际的 Lazy:_lazyFoo,并在重载的帮助下启动它:public Lazy(Func&lt;T&gt; valueFactory)

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

private MyFooService _service;

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

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

    _service = new MyFooService(_lazyFoo);
}

【讨论】:

  • 您在此处和您的问题中有错字:Retrus Returns
  • 嘿@PeterCsala 谢谢你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
  • 2017-09-03
  • 1970-01-01
  • 1970-01-01
  • 2021-01-05
  • 2018-12-11
  • 2010-09-14
相关资源
最近更新 更多