Resharper запускает UnitTest из другого места - программирование
Подтвердить что ты не робот

Resharper запускает UnitTest из другого места

Когда я запускаю модульные тесты с помощью Visual Studio, он отлично работает, потому что он выполняется из каталога проекта, где находятся все сборки. Но когда я запускаю его с помощью resharper, он идет с ошибкой на

var services = Assembly.Load("SomeAssembly");

с ошибкой

Не удалось загрузить файл или сборку "SomeAssembly" или один из ее зависимостей. Система не может найти указанный файл.

Итак, я пробовал

var path = Assembly.GetExecutingAssembly().Location;

и он не проецирует один. Это

C:\Users\* UserName *\AppData\Local\Temp\TestResults \...\Out\

и не существует "SomeAssembly" . Как настроить правильную настройку resharper или собрать все сборки, такие как Visual Studio?

Это происходит с модульными тестами, но не с NUnit, любыми идеями?

4b9b3361

Ответ 2

В документации для настроек NUnit Gui Test Runner есть следующая заметка о теневом копировании

Примечание. Если у вас возникает соблазн отключить теневую копию для доступа к файлам в том же каталоге, что и ваша сборка, вы должны знать, что есть альтернативы. Подумайте об использовании свойства Assembly.Codebase, а не Assembly.Location.

Вот пример использования свойства Assembly.Codebase

    private string AssemblyLocation()
    {
        var assembly = Assembly.GetExecutingAssembly();
        var codebase = new Uri(assembly.CodeBase);
        var path = codebase.LocalPath;
        return path;
    }

Ответ 3

У меня была та же проблема, повторный тестовый бегун был в C: \, тогда как фактические встроенные dll и решение находились на другом диске. Решение заключалось в том, чтобы отключить "Использовать устаревший бегун" на странице настроек MSTest в вариантах изменения конфигурации.

Ответ 5

Попробуйте этот код для загрузки (см. ниже). Он будет искать сборки независимо от тестового бегуна.

private static string[] assemblyLookupPath = new[]
{
    AppDomain.CurrentDomain.BaseDirectory, 
    Environment.CurrentDirectory,
    Assembly.GetExecutingAssembly().Location
}.Distinct().ToArray();

public static void Assembly Load(string fileName)
{
     var filePath = assemblyLookupPath
         .Select(f=>Path.Combine(f, fileName))
         .Where(File.Exists)
         .FirstOrDefault();

     /*do here null checks and raise errors, write logs, etc*/

     return Assembly.LoadFrom(filePath )
}

Ответ 6

Вы динамически загружаете свои сборки, используя Assembly.Load(). Может быть, вам не хватает ссылки на сборку для загрузки. В противном случае теневое копирование может пропустить незарегистрированные сборки.

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

Ответ 7

Чтобы получить очень полезный ответ от mcdon, используя assembly.Location, вы получите правильный ответ в соответствии с MSFT:

CodeBase - это URL-адрес места, где был найден файл, в то время как Местоположение - это путь от того, где он был загружен. Например, если сборка была загружена из Интернета, ее CodeBase может начните с "http://", но его местоположение может начинаться с "C: \". Если файл был скопирован теневым шрифтом, расположение - это путь к копии файл в директории shadow-copy.

Также хорошо знать, что CodeBase не гарантируется для сборок в GAC. Место всегда будет установлено для сборок загруженные с диска.

Поэтому я бы использовал следующее:

public static DirectoryInfo GetAssemblyDirectory()
{
    var assembly = Assembly.GetExecutingAssembly();    
    return new DirectoryInfo(Path.GetDirectoryName(assembly.Location));
}

Ответ 8

Просто измените текущий каталог

var dir = Path.GetDirectoryName(typeof(MySetUpClass).Assembly.Location);
Environment.CurrentDirectory = dir;

// or
Directory.SetCurrentDirectory(dir);

https://github.com/nunit/nunit/issues/1072

Ответ 9

Для меня было решено установить для свойства "Copy Local" значение true в файле nunit.framework.dll в тестовом проекте.

Ответ 10

Если у вас возникла проблема с запуском и сборкой после отключения теневой сборки, вы должны сначала выбрать "Очистить все" из опции "Сборка", а после этого создать проект в "shadow build" отключить