Я пытаюсь создать базовый прибор, который будет находиться в собственной 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();
}
}