【问题标题】:Moq C#, How can I mock this class?Moq C#,我如何模拟这个类?
【发布时间】:2015-08-12 10:24:00
【问题描述】:

我需要使用 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 不能为空

【问题讨论】:

  • 你必须模拟 IDataServices 而不是控制器
  • 好吧,你说得对。我尝试过,但原始数据服务是这样创建的: var dataService = new DataServices(importer, consumer, null, null, uhhElasticUtility);我需要许多“真实”对象来模拟它

标签: c# unit-testing testing mocking moq


【解决方案1】:

如下所示模拟你的依赖接口

var service = new Mock<IDataServices>();

将其注入您的控制器

var ctrlObj = new PvValuesController(service.Object);

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

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

最后使用控制器实例调用你的控制器方法

ctrlObj.Get("A","B","C");

【讨论】:

  • 我遇到了一个异常:“System.InvalidOperationException: HttpControllerContext.Configuration 不能为空”
  • 请提供一些代码。这是不可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-04
相关资源
最近更新 更多