我需要使用Moq框架来模拟此C#WebApi类
public class PvValuesController
{
private readonly IDataServices dataService;
public PvValuesController(IDataServices dataServices)
{
dataService = dataServices;
}
[HttpGet]
public IHttpActionResult Get(string id, string st, string et)
{
if (dataService == null)
{
return BadRequest("DataService not found");
}
var result = dataService.GetPvData(id, st, et);
return Ok(result);
}
}
问题是,如果我这样模拟它:
var controllerMock = new Mock<PvValuesController>();
我没有将任何
DataService
传递给它,因此Get()
函数将始终返回错误的请求代码。原始行是:
var controller = new PvValuesController(dataService);
其中dataService是IDataService的具体实例,并且是一个复杂的对象
我如何有效地嘲笑此类课程?
编辑:
我的新测试代码:
[Test]
public async void TestMoq()
{
var a = new List<dynamic>();
a.Add(23);
// arrange
var dataService = new Mock<IDataServices>();
dataService.Setup(l => l.GetPvData(It.IsAny<string>(), It.IsAny<DateTime>(), It.IsAny<DateTime>())).Returns(a);
var controller = new PvValuesController(dataService.Object);
// act
var actionResult = controller.Get("groupid", "timestampstart", "timestampend");
var httpResponseMessage = await actionResult.ExecuteAsync(CancellationToken.None);
// assert
Assert.AreEqual(HttpStatusCode.BadRequest, httpResponseMessage.StatusCode);
}
我在等待行上遇到异常:
System.InvalidOperationException:HttpControllerContext.Configuration不能为null
最佳答案
模拟您的依赖项界面,如下所示
var service = new Mock<IDataServices>();
将其注入您的控制器
var ctrlObj = new PvValuesController(service.Object);
然后照常继续进行服务设置
service.SetUp(l => l.Get()).Returns("Hello World!!!");
最后使用控制器实例调用控制器方法
ctrlObj.Get("A","B","C");