我是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; }
}
}
您能提示我我做错了什么吗? 有适合我问题的教程吗?
答案 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
希望有帮助。