2016-01-04 2 views
3

Я использую Microsoft.AspNet.TestHost для проведения тестов интеграции xunit. Пока тесты находятся в том же Проекте, что и asp.net-5-решение, все работает так, как должно.
Но я хотел бы поместить тесты в отдельную сборку, чтобы отделить их от решения. Но когда я пытаюсь запустить тесты в отдельном решении, я получаю сообщение об ошибке, TestServer не может найти представления.размещение asp.net 5 тестов в отдельной сборке

Bsoft.Buchhaltung.Tests.LoginTests.SomeTest [FAIL] 
    System.InvalidOperationException : The view 'About' was not found. The following locations were searched: 
    /Views/Home/About.cshtml 
    /Views/Shared/About.cshtml. 

Я думаю, что TestServer ищет относительно локального каталога для представлений. Как я могу заставить его искать правильный путь проекта?

+0

Вы нашли решение для этого –

+0

Нет, мне все еще нужно решение :( – Sam

ответ

1

Мэтт Риджуэй был написан, когда RC1 была текущая версия. Теперь (RTM 1.0.0/1.0.1) это попадающая проще:

public class TenantTests 
{ 
    private readonly TestServer _server; 
    private readonly HttpClient _client; 

    public TenantTests() 
    { 
     _server = new TestServer(new WebHostBuilder() 
       .UseContentRoot(Path.GetFullPath(Path.Combine(PlatformServices.Default.Application.ApplicationBasePath, "..", "..", "..", "..", "..", "SaaSDemo.Web"))) 
       .UseEnvironment("Development") 
       .UseStartup<Startup>()); 
     _client = _server.CreateClient(); 

    } 

    [Fact] 
    public async Task DefaultPageExists() 
    { 
     var response = await _client.GetAsync("/"); 

     response.EnsureSuccessStatusCode(); 

     var responseString = await response.Content.ReadAsStringAsync(); 

     Assert.True(!string.IsNullOrEmpty(responseString)); 

    } 
} 

Ключевым моментом здесь является .UseContentRoot(Path.GetFullPath(Path.Combine(PlatformServices.Default.Application.ApplicationBasePath, "..", "..", "..", "..", "..", "SaaSDemo.Web")))

ApplicationBasePath в тестовых сборках бен/отладки/{платформы версия}/{os-buildarchitecture}/папка. Вам нужно пройти это дерево вверх, пока вы не достигнете своего проекта, содержащего ваши взгляды. В моем случае. SaasDemo.Tests находится в той же папке, что и SaasDemo.Web, поэтому для перемещения 5 папок было нужное количество.

+1

Это не работает для меня. .. Я использую версию 1.1, в которой говорится, что «отсутствует одна или несколько ссылок компиляции». Предлагает Возможные причины включают отсутствие свойства «preserveCompilationContext» в разделе «buildOptions», в проекте project.json приложения, но оно установлено в моем .csproj файл. –

5

У меня есть образец репо здесь - https://github.com/mattridgway/ASPNET5-MVC6-Integration-Tests, который показывает исправление (спасибо Дэвиду Фаулеру).

TL; DR - При настройке TestServer вам необходимо установить базовый путь приложения, чтобы посмотреть на другой проект, чтобы он мог находить представления.

+0

Спасибо, что сделал трюк! – Sam

2

Для дальнейшего использования, обратите внимание, что теперь вы можете установить корень контента, как это: ответ

string contentRoot = "path/to/your/web/project"; 
IWebHostBuilder hostBuilder = new WebHostBuilder() 
    .UseContentRoot(contentRoot) 
    .UseStartup<Startup>(); 
_server = new TestServer(hostBuilder); 
_client = _server.CreateClient(); 
+0

протестирован с тестом в отдельном сборке, и мой путь был относительным, _server = new TestServer (новый WebHostBuilder() .UseContentRoot (@ ".. \ .. \ .. \ .. \ My.Real.Api") .UseStartup ()); –

0

Еще одно дополнительное изменение, которое я должен был сделать, чтобы получить переопределенный класс запуска, - это установить имя приложения в объекте IHostingEnvironment на фактическое имя веб-проекта (имя веб-сборки).

public TestStartup(IHostingEnvironment env) : base(env) 
     { 
      env.ApplicationName = "Demo.Web"; 
     } 

Это необходимо, когда TestStartup находится в другой сборке и переопределяет исходный класс запуска. UseContentRoot все еще требовался в моем случае.

Если имя не задано, я всегда получил 404 не найден.

Смежные вопросы