我对测试项目还是个新手。我目前有一个web api项目,其中包含Get,Put,Post和Delete方法。当涉及到编写测试用例时,我感到困惑。我是否应该编写测试代码来测试Http URL?
我的web api代码:
// GET api/values/5
[HttpGet("{id}")]
public IActionResult Get(string id)
{
using (var unitOfWork = new UnitOfWork(_db))
{
var r = unitOfWork.Resources.Get(id);
unitOfWork.Complete();
Models.resource result = ConvertResourceFromCoreToApi(r);
if (result == null)
{
return NotFound();
}
else
{
return Ok(result);
}
}
}在我的测试项目中,我有点被困在这里。我们使用的是Xunit。如何编写测试代码来测试Get方法?或者我应该编写代码来测试URL api/values/5,但是如何测试呢?
[Fact]
public void GetTest()
{
using (var unitOfWork = new UnitOfWork(new MockDatabase()))
{
}
}任何帮助都将不胜感激。
发布于 2016-09-07 00:52:11
在对控制器进行单元测试之前,您需要做一些更改。您需要将UnitOfWork类的一个实例传递给其构造函数中的控制器。那么你的控制器方法代码就变成了:
// GET api/values/5
[HttpGet("{id}")]
public IActionResult Get(string id)
{
var r = unitOfWork.Resources.Get(id);
unitOfWork.Complete();
Models.resource result = ConvertResourceFromCoreToApi(r);
if (result == null)
{
return NotFound();
}
else
{
return Ok(result);
}然后在你的单元测试中,你可以这样做:
[Fact]
public void GetTest()
{
// Arrange
// You really want to mock your unit of work so you can determine
// what you are going to send back
var unitOfWork = new MockUnitOfWork();
var systemUnderTest = new Controller(unitOfWork);
system.Request = new HttpRequestMessage();
// Act
var result = systemUnderTest.Get(1);
// Assert
// Here you need to verify that you got back the expected result
}将UnitOfWork类注入控制器可能是另一个问题。Mark Seemann在这个主题上有一个很好的post,但它可能有点高级。有许多不同的方法可以用更简单的方法(但可能不是健壮的方法)来实现这一点。谷歌在这方面是你的朋友。但是如果你有问题,可以发布另一个问题。
希望这能有所帮助。
发布于 2016-09-07 00:48:46
您需要对控制器进行一些设计更改,以使其易于测试。在您的操作中,您正在创建一个实例,这将使使用对控制器的假依赖关系进行测试变得困难。此外,您的控制器应该依赖于抽象,而不是具体化,这将使控制器更具可测试性。
public class MyWebApiController : ApiController {
private IUnitOfWork unitOfWork;
public MyWebApiController(IUnitOfWork unitOfWork) {
this.unitOfWork = unitOfWork;
}
// GET api/values/5
[HttpGet("{id}")]
public IActionResult Get(string id) {
var r = unitOfWork.Resources.Get(id);
unitOfWork.Complete();
Models.resource result = ConvertResourceFromCoreToApi(r);
if (result == null) {
return NotFound();
} else {
return Ok(result);
}
}
//...other code
}注意,控制器使用依赖注入来注入IUnitOfWork。这使得控制器更具可测试性,因为您可以在单元测试时注入其依赖项的模拟。
在那里,只需创建控制器的一个实例,并使用依赖项的模拟调用测试中的方法即可。
[Fact]
public void GetTest() {
//Arrange (Setup the parts needed to run test)
var unitOfWork = new MockUnitOfWork(new MockDatabase());
//Or using your mocking framework of choice
//var unitOfWork = Mock.Of<IUnitOfWork>(); //this is using Moq
var controller = new MyWebApiController(unitOfWork);
var id = "Test Id value here";
//Act (call the method under test)
var result - controller.Get(id);
//Assert (check results)
//...Do your assertion pertaining to result of calling method under test
}参考:Unit Testing Controllers in ASP.NET Web API 2
https://stackoverflow.com/questions/39352514
复制相似问题