我需要使用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);
}
我在await线上得到一个例外:
System.InvalidOperationException:HttpControllerContext.Configuration不能为null
答案 0 :(得分: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");