2015-05-15 2 views
0

У меня есть модульные тесты, которые ищут файл конфигурации в определенной папке путь определения пути проекта:Как VSOnline Automated Test Runs/Builds отличается от локального?

/// <summary> 
/// Gets the project path of the given type. 
/// </summary> 
/// <param name="type"></param> 
/// <returns></returns> 
public static string GetProjectPath(Type type) 
{ 
    var dll = new FileInfo(type.Assembly.Location); 
    if (dll.Directory == null || // ...\Solution\Project\bin\Build 
     dll.Directory.Parent == null || // ...\Solution\Project\bin 
     dll.Directory.Parent.Parent == null || // ...\Solution\Project 
     dll.Directory.Parent.Parent.Parent == null) // ...\Solution 
    { 
     throw new Exception("Unable to find Project Path for " + type.FullName); 
    } 

    // Class Name, Project Name, Version, Culture, PublicKeyTyoken 
    // ReSharper disable once PossibleNullReferenceException 
    var projectName = type.AssemblyQualifiedName.Split(',')[1].Trim(); 
    var projectPath = Path.Combine(dll.Directory.Parent.Parent.Parent.FullName, projectName); 

    if (!Directory.Exists(projectPath)) 
    { 
     throw new Exception(String.Format("Unable to find Project Path for {0} at {1}", type.FullName, projectPath)); 
    } 

    return projectPath; 
} 

Это прекрасно работает на Девых машинах, но когда VSOnline Строить пинает, тест блока выходит из строя, говоря он не может найти путь к проекту. Это заставляет меня полагать, что VSOnline Builds на одной машине, и модульные тесты на другом, или структура каталогов каким-то образом отличается, или модульный тест не имеет прав на чтение файловой системы ...

У кого-либо есть любое понимание того, что может быть проблемой?

+0

Как в стороне, файл конфигурации представляет собой внешнюю зависимость. Я бы подумал насмехаться над этим, чтобы ваши тесты не зависели от этого. –

+0

Я ценю ваш комментарий, @ DanielMann, но я не уверен, что это возможно. Файл конфигурации содержит список файлов Serialized XML, используемых для измечения ответов. – Daryl

ответ

0

Когда VSOnline выполняет сборку, исходные файлы находятся по адресу c:\a\src\Branch Name\, но при ее создании он строит папку c:\a\bin. Я предполагаю, что это сделано, чтобы свести к минимуму любые ошибки длинного пути. Сборка выполняется на том же сервере, но вывод отличается от того, что он выполняется локально.

Это потребовало некоторых изменений в моем методе метод GetProjectPath:

string solutionFolder = null; 

if (dll.Directory == null || // ...\Solution\Project\bin\Build 
    dll.Directory.Parent == null || // ...\Solution\Project\bin 
    dll.Directory.Parent.Parent == null || // ...\Solution\Project 
    dll.Directory.Parent.Parent.Parent == null) // ...\Solution 
{ 
    if (dll.DirectoryName == @"C:\a\bin") 
    { 
     // Build is on VSOnline. Redirect to other c:\a\src\Branch Name 
     var s = new System.Diagnostics.StackTrace(true); 
     for (var i = 0; i < s.FrameCount; i++) 
     { 
      var fileName = s.GetFrame(i).GetFileName(); 
      if (!String.IsNullOrEmpty(fileName)) 
      { 
       // File name will be in the form of c:\a\src\Branch Name\project\filename. Get everything up to and including the Branch Name 
       var parts = fileName.Split(Path.DirectorySeparatorChar); 
       solutionFolder = Path.Combine(parts[0] + Path.DirectorySeparatorChar + parts[1], parts[2], parts[3]); 
       break; 
      } 
     } 
    } 

    if (String.IsNullOrWhiteSpace(solutionFolder)) 
    { 
     throw new Exception("Unable to find Project Path for " + type.FullName + ". Assembly Located at " + type.Assembly.Location + sb); 
    } 
} 
else 
{ 
    solutionFolder = dll.Directory.Parent.Parent.Parent.FullName; 
} 
Смежные вопросы