I have an API, and I'm trying to make some integration tests for it with XUnit. Here's my API controller constructor:
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.");
}
}
}
My API controller is using this repository:
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
}
}
}
The repository uses the connection string to then make some database calls in my methods. This works when I'm calling my API methods since the configuration was setup in the Startup class of my API application.
But I'm not sure how to pass a configuration object with the connection string to my repository from my integration test methods:
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);
}
I've tried adding a json settings file to my XUnit project with my connection string info, and then trying to build it like my Startup class does, but I get an error because it's looking for the json file in my test project's inDebug
etcoreapp2.0 directory, so I'm not sure how to point the base path to the correct place either:
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
Is there a proper way to do this?
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…