Корневой веб-API GetContent .NET Core xunit ClassFixture - PullRequest
0 голосов
/ 26 мая 2018

Я пытаюсь создать базовый прибор, который будет находиться в собственной DLL , чтобы его можно было использовать во многих тестовых проектах.

У меня проблемы с настройкой содержимогоroot

.UseContentRoot(projectPath)

То, что у меня есть ниже, работает, но я жестко кодирую solutionName.

Вопрос

Как получить contentRoot без жесткого кодирования?

Могу ли я добавить что-либо в мою базовую фишку, например IHostingEnvironment или solutionName?

public class BaseFixture<TStartup> : IDisposable where TStartup : class
{

    public BaseFixture()
    {
        var startupAssembly = typeof(TStartup).GetTypeInfo().Assembly;

        var projectPath = GetProjectPath(startupAssembly);
        var host = new WebHostBuilder()
                   .UseContentRoot(projectPath)
                   .UseStartup(typeof(TStartup));

        Server = new TestServer(host);
        Client = Server.CreateClient();


    }


    private  string GetProjectPath(Assembly startupAssembly)
    {
        //Get name of the target project which we want to test
        var projectName = startupAssembly.GetName().Name;

        //Get currently executing test project path
        var applicationBasePath = PlatformServices.Default.Application.ApplicationBasePath;

        //Find the folder which contains the solution file. We then use this information to find the 
        //target project which we want to test
        DirectoryInfo directoryInfo = new DirectoryInfo(applicationBasePath);
        do
        {
            var solutionFileInfo = new FileInfo(Path.Combine(directoryInfo.FullName, "HardCodedSolutionName.sln"));
            if (solutionFileInfo.Exists)
            {
                return Path.GetFullPath(Path.Combine(directoryInfo.FullName, projectName));
            }
            directoryInfo = directoryInfo.Parent;
        }
        while (directoryInfo.Parent != null);

        throw new Exception($"Solution root could not be located using application root {applicationBasePath}");

    }

    public TestServer Server { get; set; }
    public HttpClient Client { get; }


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

1 Ответ

0 голосов
/ 26 мая 2018

Почему бы не выполнить поиск файлов *.sln во время обхода дерева каталогов, чтобы получить имя решения?

private string GetProjectPath(Assembly startupAssembly) {
    //Get name of the target project which we want to test
    var projectName = startupAssembly.GetName().Name;

    //Get currently executing test project path
    var applicationBasePath = PlatformServices.Default.Application.ApplicationBasePath;

    //Find the folder which contains the solution file. 
    //We then use this information to find the target project which we want to test
    DirectoryInfo directoryInfo = new DirectoryInfo(applicationBasePath);
    do {
        //find *.sln files
        var solutionFileInfo = directoryInfo.GetFiles("*.sln").FirstOrDefault();
        if (solutionFileInfo != null) {
            return Path.GetFullPath(Path.Combine(directoryInfo.FullName, projectName));
        }                
        directoryInfo = directoryInfo.Parent;
    }
    while (directoryInfo.Parent != null);

    throw new Exception($"Solution root could not be located using application root {applicationBasePath}");

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...