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。

Moq c#,我如何模拟这个类

模拟您的依赖接口,如下所示

var service = new Mock<IDataServices>();

注入到你的控制器

var ctrlObj = new PvValuesController(service.Object);

然后像往常一样继续设置服务

service.SetUp(l => l.Get()).Returns("Hello World!!!");

最后使用控制器实例

调用控制器方法
ctrlObj.Get("A","B","C");