Ответ 1
Сбросить копии теневых копий для тестирования по умолчанию. Если вы отключите теневую копию, она будет запущена в папке bin, и тест должен пройти. Здесь приведены некоторые инструкции по его отключению.
Когда я запускаю модульные тесты с помощью 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, любыми идеями?
Сбросить копии теневых копий для тестирования по умолчанию. Если вы отключите теневую копию, она будет запущена в папке bin, и тест должен пройти. Здесь приведены некоторые инструкции по его отключению.
В документации для настроек 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;
}
У меня была та же проблема, повторный тестовый бегун был в C: \, тогда как фактические встроенные dll и решение находились на другом диске. Решение заключалось в том, чтобы отключить "Использовать устаревший бегун" на странице настроек MSTest в вариантах изменения конфигурации.
Попробуйте создать файл testettings и настройте правила развертывания для ваших тестов.
Пожилые версии resharper, похоже, некоторые ошибки при обработке развертывания папок, я думаю, что это исправлено в последней версии resharper 7.
Попробуйте этот код для загрузки (см. ниже). Он будет искать сборки независимо от тестового бегуна.
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 )
}
Вы динамически загружаете свои сборки, используя Assembly.Load()
. Может быть, вам не хватает ссылки на сборку для загрузки. В противном случае теневое копирование может пропустить незарегистрированные сборки.
Если вы не хотите ссылаться на эти сборки, обязательно включите их в свой проект и скопируйте их в выходной каталог. Вы можете сделать это, установив свойство Копировать в выходной каталог "или создав пользовательский шаг после сборки.
Чтобы получить очень полезный ответ от 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));
}
Просто измените текущий каталог
var dir = Path.GetDirectoryName(typeof(MySetUpClass).Assembly.Location);
Environment.CurrentDirectory = dir;
// or
Directory.SetCurrentDirectory(dir);
Для меня было решено установить для свойства "Copy Local" значение true в файле nunit.framework.dll в тестовом проекте.
Если у вас возникла проблема с запуском и сборкой после отключения теневой сборки, вы должны сначала выбрать "Очистить все" из опции "Сборка", а после этого создать проект в "shadow build" отключить