【问题标题】:How to Moq methods that return "this"如何起订量返回“this”的方法
【发布时间】:2017-02-28 04:05:53
【问题描述】:

我有一个界面

interface IService
{
    IService Configure();
    bool Run();
}

“真正的”实现是这样的:

class RealService : IService
{
    public IService Configure()
    {
        return this;
    }

    public bool Run()
    {
        return true;
    }
}

使用 Moq 模拟服务会创建一个默认实现 Configure(),它返回 null

有没有办法在 Moq 中设置返回模拟实例的方法?

【问题讨论】:

    标签: c# unit-testing moq


    【解决方案1】:

    假设您使用的是Moq,您可以简单地Setup 模拟返回自身:

    var mock = new Mock<IService>();
    
    mock.Setup(service => service.Configure()).Returns(mock.Object);
    
    var testClass = new TestClass(mock.Object);
    

    然后验证该方法是否返回了您期望的结果:

    Assert.AreEqual(mock.Object, testClass.DoStuff());
    

    【讨论】:

    • 你说“微软的起订量”。你指的是this Moq吗?
    • @JeppeStigNielsen 确实,我应该更准确
    【解决方案2】:

    任何一种方法都可以设置返回模拟实例的方法。

    //Arrange
    var instance = Mock.Of<IService>();//mocked instance
    var mockService = Mock.Get(instance);//mock object used to setup instance functionality
    //setup method to return mocked instance
    mockService.Setup(m => m.Configure()).Returns(instance);
    

    或者

    //Arrange
    var mockService = new Mock<IService>();//mock object used to setup instance functionality
    var instance = mockService.Object;//mocked instance
    //setup method to return mocked instance
    mockService.Setup(m => m.Configure()).Returns(instance);
    

    【讨论】:

      【解决方案3】:

      您可以创建另一个使用相同接口的 Mock 对象并将其返回:

      [TestClass]
      public class UnitTest1
      {
      
          [TestMethod]
          public void TestMethod1()
          {
              var serviceMock1 = new Mock<IService>();
              var serviceMock2 = new Mock<IService>();
      
              serviceMock1.Setup(service => service.Configure())
                  .Returns(serviceMock2.Object);
      
              var testClass = new TestClass(serviceMock1.Object);
      
              Assert.IsNotNull(testClass.DoStuff());
          }
      }
      
      public class TestClass
      {
          private readonly IService _service;
      
          public TestClass(IService service)
          {
              _service = service;
          }
      
          public IService DoStuff()
          {
              return _service.Configure();
          }
      }
      
      
      public interface IService
      {
          IService Configure();
          bool Run();
      }
      
      public class RealService : IService
      {
          public IService Configure()
          {
              return this;
          }
      
          public bool Run()
          {
              return true;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-03-06
        • 2022-01-14
        • 1970-01-01
        • 2021-04-19
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多