模拟数据库进行API测试

时间:2020-07-05 16:39:29

标签: c# api unit-testing asp.net-core mocking

我是C#和.Net的新手,并试图进入API的单元测试。 我创建了一个项目,其中包括一个实际的数据库,一个用于数据访问的控制器,一个业务层和一个REST-API。

我需要某种测试数据库来测试我的POST方法和GET方法。 而且我想使用GET方法的一些测试数据来初始化该测试数据库。

我已经按照有关模拟数据库的Microsoft教程尝试解决了该问题,但是测试数据库正在干扰我在控制器中的实际数据库构造函数,并且该教程仅适用于模拟数据库。

这是我的控制器及其数据库构造函数

namespace TSM_Programm.Controllers
{
    public class ItemController : ControllerBase
    {

        //Constructor for DB usage 
        private TSMContext _context;

        public ItemController(TSMContext context)
        {
            _context = context;
        }

        // Get all items
        public List<Item> Getitems()
        {

            return _context.items.ToList();
        }

       //and so on...

在我的API中,使用典型的Http功能和业务层构造函数调用那些控制器方法

    [ApiController]
    public class APIController : Controller
    {

        private readonly BusinessController _business;

        public UserController(BusinessController business)
        {
            _business = business;
        }

        //GET Itemlist
        [HttpGet("AllItems")]
        public List<Item> GetAllItems()

        {
           return List<Item> newlist = _business.GetAllItems().ToList();

        }

我已经创建了第二个数据库类,它是一个接口,但是我不知道如何将其放入控制器中,因此我可以将其用于单元测试。

以供参考:

namespace TSM_Programm.Data
{
    public interface ITestDatabase : IDisposable
    {

        DbSet<Item> Items { get; set; }     
        DbSet<MoreItem> MoreItems { get; set; }
        DbSet<SomeMoreItem> SomeMoreItems{ get; set; }

        int SaveChanges();
    }
}

我的实际数据库类

namespace TSM_Programm.Data
{
    public class TSMContext : DbContext, ITestDatabase
    {

        public TSMContext(DbContextOptions<TSMContext> options) : base(options){ }
        
        DbSet<Item> Items { get; set; }     
        DbSet<MoreItem> MoreItems { get; set; }
        DbSet<SomeMoreItem> SomeMoreItems{ get; set; }
    }
}

您能提示我我做错了什么吗? 有适合我问题的教程吗?

2 个答案:

答案 0 :(得分:1)

应该将Db上下文注入到api控制器中,而不是注入存储库,然后在单元测试中模拟存储库。

您也不应该将一个控制器注入另一个控制器。

您的礼貌图应该看起来像这样。

apicontroller->回购-> DbContext

apicontroller->服务->回购-> DbContext

Here is an Example on how to test a controller on Microsoft.com

答案 1 :(得分:0)

实际上不需要ITestDatabase,如果创建ITestDatabase是出于测试目的,则可以将其删除。 相反,您可以做的是,纯粹出于测试目的创建另一个数据库。可以将其称为TestDb并加载测试数据。

一旦准备就绪,为了在控制器中测试您的方法,请使用xunit之类的测试框架来编写您的测试,以模仿调用get和post方法并通过连接到测试数据库执行它们的行为。 / p>

内联链接可以用作设置测试的起点。

Unit Testing web api with x unit

希望有帮助。