【问题标题】:Moq - How to implement mock for method of generic base class?Moq - 如何为通用基类的方法实现模拟?
【发布时间】:2021-06-08 14:15:48
【问题描述】:

我有如下实现的接口和服务:

public interface IParentInterface<T> where T : class
{
    T GetParent(T something);
}

public interface IChildInterface : IParentInterface<string>
{
    string GetChild();
}

public class MyService
{
    private readonly IChildInterface _childInterface;

    public MyService(IChildInterface childInterface)
    {
        _childInterface = childInterface;
    }

    public string DoWork()
    {
        return _childInterface.GetParent("it works");
    }
}

这是我对 MyService 类的 DoWork 方法的测试:

  • 新建一个子接口的模拟对象
  • 设置父接口的GetParent方法
  • 将模拟对象传递给服务构造函数
  • 执行 DoWork
  • 期望有 resp = "它确实适用于某些东西!"但它是空的
[Fact]
public void Test1()
{
    var mockInterface = new Mock<IChildInterface>();
    mockInterface
        .As<IParentInterface<string>>()
        .Setup(r => r.GetParent("something"))
        .Returns("It really works with something!");

    var service = new MyService(mockInterface.Object);

    string resp = service.DoWork(); // expects resp = "It really works with something!" but it's null

    Assert.NotNull(resp);
}

其他信息:

  • 起订量 4.16.1
  • .NET 核心 (.NET 5)
  • XUnit 2.4.1

【问题讨论】:

    标签: c# interface mocking moq


    【解决方案1】:

    您的模拟设置是说要模拟传入 "something" 的方法。您应该更改它以匹配传入的类,例如"it works" 或更简单的方法是允许使用 It.IsAny&lt;string&gt;() 的任何字符串。例如:

    mockInterface
        .As<IParentInterface<string>>()
        .Setup(r => r.GetParent(It.IsAny<string>()))
        .Returns("It really works with something!");
    

    【讨论】:

      猜你喜欢
      • 2011-10-26
      • 1970-01-01
      • 2016-03-07
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多