Сбои ресурсов приложения в модульных тестах из-за неконтролируемого теневого копирования из ReSharper
Фон:
В приложении, над которым я работаю, я пишу тесты, используя смесь Visual Studio 2015, SpecFlow и ReSharper 2016.3 (я сокращу это до R#, потому что я ленивый).
Приложение, над которым я работаю, отправляет электронные письма в формате HTML на основе шаблона, которые хранятся в файлах HTML, для которых установлено значение "Всегда копировать" в Visual Studio 2015.
Проблема:
Когда я пытаюсь запустить свои тесты, я получаю следующее исключение:
System.IO.DirectoryNotFoundException: Could not find a part of the path 'C:\Users\[Me]\AppData\Local\JetBrains\Installations\ReSharperPlatformVs14_001\Resources\SomeEmailTemplate.html`
Этот каталог не был выходным каталогом проекта, над которым я работаю, поэтому я дважды проверил настройки R # и подтвердил, что Shadow Copy отключен. Чтобы быть совершенно ясным, мой флажок R# Shadow Copy действительно снят.
Оскорбительный код действительно довольно прост. Нормальные средства, такие как TestContext.CurrentContext.TestDirectory
это не то, что я могу, должен или даже хочу сделать из-за того, что этот код нужен самому приложению. Было бы целесообразно поместить код тестового фреймворка в тестируемое приложение.
public class HtmlTemplateLog : ISectionedLog, IRenderableLog
{
#region Variables / Properties
private readonly string _rawHtml;
private readonly Dictionary<string, StringBuilder> _sectionDictionary = new Dictionary<string, StringBuilder>();
private StringBuilder _workingSection;
#endregion Variables / Properties
#region Constructor
public HtmlTemplateLog(string templateFile)
{
// This is specifically what breaks the tests.
_rawHtml = File.ReadAllText(templateFile)
.Replace("\r\n", string.Empty); // Replace all newlines with empty strings.
}
#endregion Constructor
#region Methods
// Methods work with the section dictionary.
// The RenderLog method does a string.Replace on all section names in the HTML.
// These methods aren't important for the question.
#endregion Methods
Это вызывается как в примере ниже:
_someLog = new HtmlTemplateLog("Resources/SomeEmailTemplate.html");
// ...code...
_someLog.WriteLineInSection("{someSection}", "This is a message!");
string finalHtml = _someLog.RenderLog();
Вопросы:
1. Я отключил Shadow Copy в своих тестах R #. Почему это все еще делает Теневые Копии?
2. Каким образом я могу обойти тот факт, что R # не соблюдает флажок Shadow Copy, учитывая, что это не тестовый код, и, следовательно, что средства, которые обычно подходят для тестового кода, не подходят для этого случая?
1 ответ
Я нашел ответ для № 2... хотя, это довольно неуклюже. Я был вдохновлен ответом от @mcdon для менее подробной версии вопроса.
Если я не хочу прибегать к TestContext.CurrentContext.TestDirectory
, тогда мне нужно превратить мои локальные имена файлов в абсолютные пути. К сожалению, неправильная настройка Shadow Copy в R# создает больше работы, так как я не могу просто запросить текущую сборку - это скажет мне неправильную вещь. Мне нужно взяться за кодовую базу и допросить это.
Однако я все еще немного беспокоюсь о том, что это за код, когда мы пытаемся запустить его на сервере сборки - я ожидаю "неожиданных" результатов. В этом свете мне интересно, можно ли действительно назвать неожиданные результаты неожиданными, учитывая, что я ожидаю, что это не сработает...
В любом случае, исправление, которое я придумал, было этой системой свойств полей:
private string _presentWorkingDirectory;
private string PresentWorkingDirectory
{
get
{
if (!string.IsNullOrEmpty(_presentWorkingDirectory))
return _presentWorkingDirectory;
var assembly = Assembly.GetExecutingAssembly();
var codebase = new Uri(assembly.CodeBase);
var filePath = codebase.LocalPath;
var path = Directory.GetParent(filePath);
_presentWorkingDirectory = path.ToString();
return _presentWorkingDirectory;
}
}