【问题标题】:How to mock HttpConfiguration?如何模拟 HttpConfiguration?
【发布时间】:2020-04-06 21:23:23
【问题描述】:

我必须在单元测试中测试控制器。此控制器在构造函数中需要“HttpConfiguration”。我想用Moq来模拟一个对象,但是我不知道怎么做。”HttpConfiguration“既没有接口也没有虚方法。

被测试的方法包含这样的调用 Configuration.Services.GetApiExplorer().ApiDescriptions

如何在 mock 中设置“ApiDescriptions”?

【问题讨论】:

    标签: c# unit-testing moq


    【解决方案1】:

    HttpConfiguration 没有实现任何接口,并且由于您无法使用 Moq 模拟该类的实际实现,您可能希望围绕它创建一个自定义包装器,让我们这样说:

    public interface IHttpConfiguration
    {
         bool IsPositive(int num);
    }
    

    然后让你的HttpConfiguration 类实现它:

    public class HttpConfiguration: IHttpConfiguration
    {
         public bool IsPositive(int num)
         {
            return num > 0;
         }
    }
    

    在您的控制器中:

    public class MyController: Controller
    {
         private readonly IHttpConfiguration _httpConfiguration;
    
         public MyController(IHttpConfiguration httpConfiguration)
         {
            _httpConfiguration = httpConfiguration;
         }
    
         //Your controller methods here
    }
    

    假设您在 Startup.cs 中使用 .NET Core:

    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
    
        public IConfiguration Configuration { get; }
    
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddTransient<IHttpConfiguration, HttpConfiguration>();
            //other logic here
        }
    }
    

    在你的单元测试类中:

    public class MyControllerTest
    {
        private Mock<IHttpConfiguration> _mockHttpConfiguration;
        private MyController _myController;
    
        [TestInitialize]
        public void TestInitialize()
        {
            _mockHttpConfiguration = new Mock<IHttpConfiguration>();
            _myController = new MyController(_mockHttpConfiguration.Object);
        }
    
        [TestMethod]
        public void TestMock()
        {
            //mock methods you need and assert
            _mockHttpConfiguration.Setup(x=>x.IsPositive(2)).Returns(false); 
        }
    }
    

    我使用IsPositive() 仅用于演示目的。您必须对要模拟的 HttpConfiguration 类中的方法应用相同的逻辑。

    【讨论】:

      猜你喜欢
      • 2013-01-23
      • 2021-11-17
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 2020-02-22
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多