gpt4 book ai didi

c# - 如何在我的集成测试中使用 IConfiguration?

转载 作者:行者123 更新时间:2023-11-30 23:08:53 27 4
gpt4 key购买 nike

我有一个 API,我正在尝试使用 XUnit 对其进行一些集成测试。这是我的 API Controller 构造函数:

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 Controller 正在使用这个存储库:

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);
}

我已经尝试使用我的连接字符串信息向我的 XUnit 项目添加一个 json 设置文件,然后尝试像我的 Startup 类那样构建它,但是我收到一个错误,因为它正在我的测试项目的\bin\Debug\netcoreapp2.0\目录,所以我也不确定如何将基本路径指向正确的位置:

var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();

有没有正确的方法来做到这一点?

最佳答案

我认为在你的测试项目中使用依赖注入(inject)会更好;以备将来使用。

在你的测试项目中:

  1. 向您的测试项目添加一个新的 appsettings.json 文件,其中包含您需要的所有配置。
  2. 安装包:Microsoft.Extensions.DependencyInjection。
  3. 为测试设置创建一个类;例如 TestSetup.cs。

    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; }
    }
  4. 在你的测试课上;我正在使用 Xunit

    public class MyControllerTest: IClassFixture<TestSetup>
    {
    private ServiceProvider _serviceProvider;
    private MyController _myController;

    public MyControllerTest(TestSetup testSetup)
    {
    _serviceProvider = testSetup.ServiceProvider;
    _myController = _serviceProvider.GetService<MyController>();
    }

    [Fact]
    public async Task GetUserShouldReturnOk()
    {
    var result = await _myController.GetUser(userId);
    Assert.IsType<OkResult>(result);
    }

    }

关于c# - 如何在我的集成测试中使用 IConfiguration?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46269931/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com