Сбои ресурсов приложения в модульных тестах из-за неконтролируемого теневого копирования из 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;
    }
}
Другие вопросы по тегам