首页 > 解决方案 > 如何模拟 HttpConfiguration?

问题描述

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

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

我该怎么做才能在模拟中设置“ApiDescriptions”?

标签: c#unit-testingmoq

解决方案


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 类中的方法应用相同的逻辑。


推荐阅读