Как издеваться над HttpConfiguration? - PullRequest
0 голосов
/ 07 апреля 2020

Я должен проверить контроллер в моих модульных тестах. Этот контроллер требует "HttpConfiguration" в конструкторе. Я хотел бы использовать Moq для имитации объекта, но я не знаю, как это сделать. «HttpConfiguration» не имеет ни интерфейса, ни виртуальных методов.

Тестируемый метод содержит такой вызов Configuration.Services.GetApiExplorer().ApiDescriptions

Что я могу сделать, чтобы установить "ApiDescription" в макете?

1 Ответ

0 голосов
/ 07 апреля 2020

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
}

Предполагая, что вы используете. NET Core, в вашем Startup.cs:

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() только для демонстрационных целей. Вы должны применить ту же логику c для методов в классе HttpConfiguration, которые вы хотите смоделировать.

...