如何测试API控制器方法

问题描述 投票:1回答:1

我真的很困,需要您的帮助。

我有一个.NET Core 2.1 API,我想创建一个nUnitTest项目(NUnit 3.10.1)来测试API的控制器,但是我不知道如何从nUnitTest和确实需要一些帮助

我尝试过的事情:

1)在控制器中生成无参数构造函数,并从Test方法实例化控制器,但这不起作用。

2)在Test类中生成一个构造函数以定义db上下文,但这也不起作用。

这是我的API控制器:

public class PersonController : ControllerBase
{
    private readonly NetCoreAPI1Context _context;

    public PersonController(NetCoreAPI1Context context)
    {
        _context = context;
    }

    // POST: api/Person
    [HttpPost]
    public async Task<IActionResult> PostPerson([FromBody] Person person)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        _context.Persons.Add(person);
        await _context.SaveChangesAsync();

        return CreatedAtAction("GetPerson", new { id = person.Id }, person);
    }
}

这里是NetCoreAPI1Context

public class NetCoreAPI1Context : DbContext
{
    public NetCoreAPI1Context(DbContextOptions<NetCoreAPI1Context> options)
      : base(options)
    {
    }
    public DbSet<Person> Persons { get; set; }
}

这里是Person

public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
}

我已验证控制器中的PostPerson操作有效。

然后我将nUnitTest项目添加到解决方案中。

这是我的简单测试类和方法:

class PersonControllerTest
{
    Person _person;

    //NetCoreAPI1Context _context;

    [SetUp]
    public void Setup()
    {
        _person = new Person
        {
            FirstName = "David",
            LastName = "Johnson",
            Email = "[email protected]"
        };
    }

    //public PersonControllerTest(NetCoreAPI1Context context)
    //{
    //    _context = context;
    //}

    [Test]
    public void PostPersonTest()
    {
        var person = _person; // confirm that "person" has data and ready to be used
        //
        // HOW To CALL THE COTROLLER METHOD PostPerson(...) HERE????
        //

    }
}
asp.net-core-webapi nunit-3.0
1个回答
0
投票

这是有关如何进行NUnit测试的步骤:

1。在您的nUnitTest项目中,您需要右键单击Dependencies,然后选择添加引用(Web Api项目):enter image description here2.WebApi项目控制器:

[Route("api/[controller]")]
[ApiController]
public class PeopleController : ControllerBase
{
    private readonly WebApi2Context _context;

    public PeopleController(WebApi2Context context)
    {
        _context = context;
    }

    // GET: api/People
    [HttpGet]
    public async Task<ActionResult<IEnumerable<Person>>> GetPerson()
    {
        return await _context.Person.ToListAsync();
    }
    // POST: api/People
    [HttpPost]
    public async Task<ActionResult> PostPerson(Person person)
    {
        _context.Person.Add(person);
        await _context.SaveChangesAsync();

        return CreatedAtAction("GetPerson", new { id = person.Id }, person);
    }
}

3.nUnitTest项目(请确保已安装软件包Microsoft.EntityFrameworkCoreMicrosoft.EntityFrameworkCore.SqlServer):

class PersonControllerTest
{
    public static DbContextOptions<WebApi2Context> dbContextOptions { get; }
    public static string connectionString = "Server=(localdb)\\mssqllocaldb;Database=YourDatabaseName;Trusted_Connection=True;MultipleActiveResultSets=true";
    Person _person;
    static PersonControllerTest()
    {
        dbContextOptions = new DbContextOptionsBuilder<WebApi2Context>()
            .UseSqlServer(connectionString)
            .Options;
    }
    [SetUp]
    public void Setup()
    {
        _person = new Person
        {
           //Id=1,If Id is not designed by using IDENTITY (1, 1),you need to add this line
            FirstName = "David",
            LastName = "Johnson",
            Email = "[email protected]"
        };
    }
    [Test]
    public void Test1()
    {
        var context = new WebApi2Context(dbContextOptions);
        PeopleController person = new PeopleController(context);
        var data = person.PostPerson(_person);
        var response = data.Result as CreatedAtActionResult;
        var item = response.Value as Person;
        Assert.AreEqual("David", item.FirstName);
        Assert.AreEqual("Johnson", item.LastName);
        Assert.AreEqual("[email protected]", item.Email);

    }
}

4。结果:enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.