Я действительно застрял и нуждаюсь в вашей помощи.

У меня есть API .NET Core 2.1, и я хочу создать проект 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 = "dj@dj.com"
        };
    }

    //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????
        //

    }
}
1
CB4 12 Окт 2019 в 23:12

1 ответ

Лучший ответ

Вот шаг о том, как протестировать NUnit:

1. В вашем проекте nUnitTest вам нужно щелкнуть правой кнопкой мыши Зависимости и выбрать добавить ссылку (проект Web Api): введите здесь описание изображения 2. Контроллер проекта 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.EntityFrameworkCore и Microsoft.EntityFrameworkCore.SqlServer):

using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using NUnit.Framework;
using WebApi2.Controllers;
using WebApi2.Data;
using WebApi2.Models;
namespace NUnitTestProject1
{
    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 = "dj@dj.com"
            };
        }
        [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("dj@dj.com", item.Email);

        }
    }
}

4. Результат: введите описание изображения здесь

0
Rena 14 Окт 2019 в 08:11