【发布时间】:2018-02-26 10:30:56
【问题描述】:
我有一个 API,我正在尝试使用 XUnit 对其进行一些集成测试。这是我的 API 控制器构造函数:
public class MyController : Controller
{
readonly IMyRepository _myRepository;
public MyController(IMyRepository myRepository)
{
_myRepository = myRepository;
}
public async Task<IActionResult> GetUser(Guid userId)
{
try
{
return Ok(await _my.GetUser(userId));
}
catch (Exception ex)
{
return StatusCode(500, "An error occurred while handling your request.");
}
}
}
我的 API 控制器正在使用此存储库:
public class MyRepository : IMyRepository
{
private string _connectionString;
public MyRepository(IConfiguration config)
{
_connectionString = config.GetConnectionString("DefaultConnection");
}
public async Task<User> GetUser(Guid userId)
{
using (SqlConnection con = new SqlConnection(connectionString))
{
// call stored proc
}
}
}
存储库使用连接字符串在我的方法中进行一些数据库调用。这在我调用我的 API 方法时有效,因为配置是在我的 API 应用程序的 Startup 类中设置的。
但我不确定如何将带有连接字符串的配置对象从我的集成测试方法传递到我的存储库:
public async Task GetUserShouldReturnOk()
{
var userId = new Guid();
var configuration = // ????
var controller = new MyController(
new MyRepository(configuration));
var result = await controller.GetUser(userId);
Assert.IsType<OkResult>(result);
}
我尝试使用我的连接字符串信息将 json 设置文件添加到我的 XUnit 项目中,然后尝试像我的 Startup 类一样构建它,但我收到一个错误,因为它正在我的测试项目中寻找 json 文件\bin\Debug\netcoreapp2.0\ 目录,所以我不确定如何将基本路径指向正确的位置:
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
有没有合适的方法来做到这一点?
【问题讨论】:
-
存储库会连接到实际数据源还是会用假数据模拟源?只需模拟配置接口并将其注入依赖类。没有足够的信息来提供比刚才建议的更好的信息。
-
您能否展示如何使用连接字符串。我认为当前的存储库实现可能存在一些设计问题。
-
@Nkosi - 它连接到一个实际的数据源。我添加了代码,以便您可以查看存储库中如何使用连接字符串。
-
在考虑了我最初的建议之后,为什么不将配置生成器的基本路径设置为 json 文件所在的路径?
-
您还应该查看有关该主题的官方文档Integration testing in ASP.NET Core
标签: c# unit-testing asp.net-core integration-testing xunit