C# 使用InMemory测试ASP.NET核心API控制器

C# 使用InMemory测试ASP.NET核心API控制器,c#,testing,asp.net-core,controller,in-memory-database,C#,Testing,Asp.net Core,Controller,In Memory Database,我正在尝试使用内存数据库而不是SQL server测试ASP.NET核心API控制器。我还使用NUnit编写测试。在我的设置方法中,我创建了一些数据并将其添加到InMemory上下文中,这似乎工作得很好,但当我尝试使用控制器检索数据时,会得到空值 这是我的控制器的一部分: 公共类PeopleController:ControllerBase { 私有应用程序的bContext\u上下文; 专用图像映射器; public People Controller(ApplicationDbContext

我正在尝试使用内存数据库而不是SQL server测试ASP.NET核心API控制器。我还使用NUnit编写测试。在我的设置方法中,我创建了一些数据并将其添加到InMemory上下文中,这似乎工作得很好,但当我尝试使用控制器检索数据时,会得到空值

这是我的控制器的一部分:

公共类PeopleController:ControllerBase
{
私有应用程序的bContext\u上下文;
专用图像映射器;
public People Controller(ApplicationDbContext上下文,IMapper映射器)
{
_上下文=上下文;
_映射器=映射器;
}
//获取/api/people
[HttpGet]
public IActionResult GetPeople()
{
返回Ok(_context.People.ToList().Select(_mapper.Map));
}
}
下面是我测试课的一部分。调试测试时,我添加到_上下文中的两个Person对象已正确添加,但当我调用
\u controller.GetPeople()
时,这两个对象不会显示,但返回null。使用我的SQL Server,该方法“实时”运行良好

[TestFixture]
class PeopleControllerTests
{
    private ApplicationDbContext _context;
    private IMapper _mapper;
    private PeopleController _controller;

    [SetUp]
    public void SetUp()
    {
        _mapper = GenerateConcreteInstance();

        var options = new DbContextOptionsBuilder<ApplicationDbContext>().UseInMemoryDatabase(databaseName: "TestDb").Options;
        _context = new ApplicationDbContext(options);

        _context.People.Add(new Person()
        { Id = 1, Firstname = "XXXXX", Lastname = "XXXXXXX", Email = "XXXX@XXXX.com", City = "XXXXX", DateCreated = DateTime.Now });
        _context.People.Add(new Person()
        { Id = 2, Firstname = "YYYYY", Lastname = "YYYYYYY", Email = "YYYY@YYYY.com", City = "YYYYY", DateCreated = DateTime.Now });
        _context.SaveChanges();

        _controller = new PeopleController(_context, _mapper);
    }

    [Test]
    public void GetAll_WhenCalled_ReturnPeopleInDb()
    {
        var result = _controller.GetPeople();

        var okObjectResult = result as OkObjectResult;
        var content = okObjectResult.Value as IEnumerable<Person>;
        Assert.IsNotNull(content);

    }

    private IMapper GenerateConcreteInstance()
    {
        var config = new AutoMapper.MapperConfiguration(c =>
        {
            c.AddProfile(new ApplicationProfile());
        });

        return config.CreateMapper();
    }
}
[TestFixture]
类人物控制器测试
{
私有应用程序的bContext\u上下文;
专用图像映射器;
私人控制人(控制人),;
[设置]
公共作废设置()
{
_映射器=GenerateCreteInstance();
var options=new DbContextOptionsBuilder().UseInMemoryDatabase(databaseName:“TestDb”).options;
_上下文=新的ApplicationDbContext(选项);
_context.People.Add(newperson()
{Id=1,Firstname=“XXXXX”,Lastname=“XXXXXXX”,Email=”XXXX@XXXX.com,City=“XXXXX”,DateCreated=DateTime.Now});
_context.People.Add(newperson()
{Id=2,Firstname=“YYYYY”,Lastname=“YYYYYYY”,Email=”YYYY@YYYY.com,City=“yyyy”,DateCreated=DateTime.Now});
_SaveChanges();
_控制器=新的PeopleController(\u上下文,\u映射器);
}
[测试]
public void GetAll_when called_ReturnPeopleInDb()
{
var result=_controller.GetPeople();
var okObjectResult=结果为okObjectResult;
var content=okObjectResult.Value作为IEnumerable;
Assert.IsNotNull(内容);
}
私有IMapper GenerateConcreteInstance()
{
var config=new AutoMapper.MapperConfiguration(c=>
{
c、 AddProfile(新应用程序配置文件());
});
返回config.CreateMapper();
}
}
非常感谢您的帮助,因为我不熟悉ASP.NET核心和测试

您必须致电:

\u context.SaveChanges()

要在使用
\u context.Add(T)
添加新条目时将更改提交到数据库,您必须调用:

\u context.SaveChanges()


要在添加带有
\u context.Add(T)

的新条目进行集成测试(这就是您在这里所做的)时将更改提交到数据库,您应该使用测试服务器。请参阅:更直接地说,您不需要在安装程序中保存添加到上下文中的数据。@谢谢,我已经在代码中修复了这个问题。仍然不起作用,但将阅读上面Chris Pratt建议的使用测试服务器。对于集成测试(这就是您在这里所做的),您应该使用测试服务器。请参阅:更直接地说,您不需要在安装程序中保存添加到上下文中的数据。@谢谢,我已经在代码中修复了这个问题。仍然不起作用,但将按照上面ChrisPratt的建议阅读关于使用测试服务器的内容。