【发布时间】: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