Как заставить TestServer использовать другой файл appsettings? - PullRequest
0 голосов
/ 21 февраля 2019

У меня довольно странная проблема.Я пытаюсь настроить TestServer для тестирования ASP.NET API.В этом конкретном тесте вместо appsettings.json проекта я хочу использовать другой конфиг, appsettings.custom.json.Итак, когда я создаю свой TestServer, вот что я делаю:

protected TestServer CreateTestServer()
{
    var testConfiguration = new AspNetTestConfiguration(); // configures middleware, authentication, default/static files
    var configFile = "appsettings.custom.json";
    var config = new ConfigurationBuilder().AddJsonFile(configFile).Build();
    Container.Configure(cfg => cfg.For<IConfiguration>().Use(config)); // attempt 1 - that's my StructureMap container used for DI

    // Create the WebHostBuilder used by the test server
    var webHostBuilder = WebHost.CreateDefaultBuilder()
                                .ConfigureServices(svc =>
                                                   {
                                                       svc.AddSingleton(Container);
                                                       svc.AddSingleton(config); // attempt 2
                                                       svc.AddSingleton(testConfiguration);
                                                   })
                                .UseConfiguration(config) // attempt 3
                                .UseStartup<TestStartup>();

    return new TestServer(webHostBuilder);
}

Но затем, когда я попадаю в свой контроллер, который имеет IConfiguration, предоставленный в конструкторе посредством внедрения зависимостей, я получаю доступнастройки в IConfiguration и найдите, что это значения из appsettings.json!

Как вы можете видеть выше, я попробовал 3 различных способа убедить TestServer, что он должен использовать configзначения от appsettings.custom.json, безрезультатно.

Почему он по-прежнему настаивает на использовании appsettings.json, и как мне это исправить?

ОБНОВЛЕНИЕ: Любопытнее истраньше.Я попытался переименовать appsettings.json в appsettings.default.json и установить его в качестве файла настроек по умолчанию.Теперь волшебным образом мой TestServer использует appsettings.custom.json там, где я ожидал!

1 Ответ

0 голосов
/ 21 февраля 2019

Убедитесь, что вы установили тестовый json-файл для копирования в выходной каталог, если новее

Мы используем это для этой ситуации в .NET Core 2.x

public class TestServerFixture : IDisposable
{
    private readonly TestServer _testServer;
    public HttpClient Client { get; }

    public TestServerFixture(string assemblyName)
    {

        IWebHostBuilder builder = new WebHostBuilder()
               .UseContentRoot(Path.Combine(ConfigHelper.GetSolutionBasePath(), assemblyName))
               .UseEnvironment("Development")
               .UseConfiguration(new ConfigurationBuilder()
                    .AddJsonFile("appsettings.tests.integration.json") //the file is set to be copied to the output directory if newer
                    .Build()
                ).UseStartup(assemblyName);

        _testServer = new TestServer(builder);

        Client = _testServer.CreateClient();
    }

    public void Dispose()
    {
        Client.Dispose();
        _testServer.Dispose();
    }
}

иполучить базовый путь решения

/// <summary>
/// Gets the current soution base path
/// </summary>
/// <returns></returns>
public static string GetSolutionBasePath()
{
    var appPath = PlatformServices.Default.Application.ApplicationBasePath;
    var binPosition = appPath.IndexOf("\\bin", StringComparison.Ordinal);
    var basePath = appPath.Remove(binPosition);

    var backslashPosition = basePath.LastIndexOf("\\", StringComparison.Ordinal);
    basePath = basePath.Remove(backslashPosition);
    return basePath;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...