我必须在我的单元测试中测试控制器。此控制器需要在构造函数中使用"HttpConfiguration“。我想用Moq来模拟一个对象,但是我不知道怎么做。“HttpConfiguration”既没有接口也没有虚方法。
被测试的方法包含这样一个调用Configuration.Services.GetApiExplorer().ApiDescriptions
如何在模拟中设置"ApiDescriptions“?
发布于 2020-04-07 08:26:52
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内核,在你的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()。您必须对要模拟的HttpConfiguration类中的方法应用相同的逻辑。
https://stackoverflow.com/questions/61069200
复制相似问题