Неожиданное расположение Assembly.GetExecutingAssembly, когда NUnit запускает несколько сборок - PullRequest
0 голосов
/ 24 января 2019

Недавно я столкнулся со странной проблемой при выполнении юнит-тестов.Мое решение содержит вспомогательный класс со свойством для получения каталога исполняемой сборки.Это выглядит следующим образом:

public static class DirectoryHelper
{
    public static string ExecutingAssemblyDirectory
    {
        get
        {
            var codeBase = Assembly.GetExecutingAssembly().CodeBase;
            var uri = new UriBuilder(codeBase);
            var path = Uri.UnescapeDataString(uri.Path);
            return Path.GetDirectoryName(path);
        }
    }
}

Этот метод вызывается из различных тестовых классов для получения относительных путей к файлам к зависимым ресурсам.

В качестве примеров возьмем следующие надуманные проекты:

TestProject1.dll - TestFixture1.cs

[TestFixture]
public class TestFixture1
{
    [Test]
    public void VerifyExecutingAssemblyDirectory1()
    {
        StringAssert.Contains(@"\TestProject1\bin\Debug", 
        DirectoryHelper.ExecutingAssemblyDirectory);
    }
}

TestProject2.dll - TestFixture2.cs

[TestFixture]
public class TestFixture2
{
    [Test]
    public void VerifyExecutingAssemblyDirectory1()
    {
        StringAssert.Contains(@"TestProject2\bin\Debug", 
        DirectoryHelper.ExecutingAssemblyDirectory);
    }
}

Когда эти тесты запускаются по отдельности, они проходят, и местоположение возвращаемой сборки является папкой отладки класса теста.

Однако при запуске вместеTestFixture2.VerifyExecutingAssemblyDirectory2 () фактически возвращает путь к папке bin TestProject1, а не TestProject2.

Я пытаюсь определить, почему происходит такое поведение, и лучше понять, как это происходитоб этом. Я обнаружил, что использование .GetCallingAssembly решит эту проблему, но не похоже, что мне нужно это делать.

Я создал пример для воспроизведенияэтот вопрос и размещен на GitHub. TylerNielsen / NUnitExecutingAssemblyExample

Примечание. Мне известно о TestContext.TestDirectory в NUnit, однако в настоящее время эта библиотека не зависит от NUnit, и я бы предпочел сохранить ее таким образом.

ОБНОВЛЕНИЕ Я запускаю тесты NUnit через Resharper в Visual Studio и через консоль NUnit3.Когда я запускаю с помощью NUnit3-Console, я указываю только два отдельных .dll и не предоставляю никаких других аргументов.

1 Ответ

0 голосов
/ 24 января 2019

TestProject1 и TestProject2 ссылаются на сборку, содержащую DirectoryHelper. Я предполагаю, что из-за ваших ссылок сборка будет скопирована в отдельные (отдельные) выходные каталоги.

Когда вы запускаете обе тестовые сборки вместе, одна из них приводит к загрузке "личной" копии этой сборки. Второй обнаруживает, что сборка уже находится в памяти.

Конечно, это поведение будет зависеть от того, как вы запускаете сборки, чего вы еще не сказали. В случае, если вы используете nunit3-console, это также будет зависеть от ваших аргументов командной строки, особенно от того, используете ли вы отдельный процесс для каждой сборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...