我有一个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();
有没有正确的方法呢?
答案 0 :(得分:2)
appsettings.json文件就在我的测试项目根目录中,您是否知道获取当前项目路径的简便方法,以便我不必对该值进行硬编码
将文件的Build Action
属性设置为Content
,以便将其复制到输出目录,以便在测试时将其移动到bin,然后您可以将原始配置代码与{{1 }}
.SetBasePath(Directory.GetCurrentDirectory())
答案 1 :(得分:0)
我认为最好在测试项目中使用依赖注入;供将来使用。
在您的测试项目中:
为测试设置创建一个类;例如TestSetup.cs。
NSWindowController
在您的测试课中;我正在使用Xunit
public class TestSetup
{
public TestSetup()
{
var serviceCollection = new ServiceCollection();
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(
path: "appsettings.json",
optional: false,
reloadOnChange: true)
.Build();
serviceCollection.AddSingleton<IConfiguration>(configuration);
serviceCollection.AddTransient<MyController, MyController>();
ServiceProvider = serviceCollection.BuildServiceProvider();
}
public ServiceProvider ServiceProvider { get; private set; }
}