Moq c#,我如何模拟这个类
本文关键字:模拟 何模拟 Moq | 更新日期: 2023-09-27 18:07:32
我需要使用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);
}
我在等待行得到一个异常:
系统。InvalidOperationException: HttpControllerContext。
模拟您的依赖接口,如下所示
var service = new Mock<IDataServices>();
注入到你的控制器
var ctrlObj = new PvValuesController(service.Object);
然后像往常一样继续设置服务
service.SetUp(l => l.Get()).Returns("Hello World!!!");
最后使用控制器实例
调用控制器方法ctrlObj.Get("A","B","C");