web-dev-qa-db-fra.com

Resharper exécute UnitTest depuis un emplacement différent

Lorsque j'exécute des tests unitaires avec Visual Studio, cela fonctionne correctement car il s'exécute à partir du répertoire du projet où se trouvent tous les assemblys. Mais quand je le lance avec resharper ça marche avec erreur 

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

avec erreur

Impossible de charger le fichier ou l'assembly 'SomeAssembly' ou l'un de ses dépendances. Le système ne peut pas trouver le fichier spécifié..

Donc j'ai essayé 

var path = Assembly.GetExecutingAssembly().Location;

et ce n'est pas le projet un. Ses 

C:\Utilisateurs\* Nom d'utilisateur *\AppData\Local\Temp\TestResults\...\Out \

et il n'y a pas 'SomeAssembly' . Comment configurer correctement resharper ou collecter tous les assemblys comme Visual Studio?

Cela arrive avec des tests unitaires mais pas avec NUnit, des idées?

47
Roar

Resharper copie les assemblages à des fins de test par défaut. Si vous désactivez le cliché instantané, il s'exécutera dans le dossier bin et le test devrait réussir. Voici quelques instructions pour l'éteindre.

42
tallseth

Dans les paramètres de la documentation for Nuiit Gui Test Runner, vous trouverez la remarque suivante concernant le cliché instantané.

Remarque: Si vous êtes tenté de désactiver le cliché instantané afin d'accéder aux fichiers situés dans le même répertoire que votre Assemblée, vous devez savoir qu'il existe des alternatives. Envisagez d'utiliser la propriété Assembly.Codebase plutôt que Assembly.Location.

Voici un exemple d'utilisation de la propriété Assembly.Codebase

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

J'ai eu le même problème, resharper test runner était en C:\alors que les dll construites et la solution étaient sur un autre lecteur. La solution consistait à décocher "Utiliser Legacy Runner" dans la page des paramètres MSTest dans les options de resharper.

12
sinaptik

Essayez de créer un fichier testsettings et de configurer les règles de déploiement de vos tests .

Les anciennes versions de resharper semblent avoir quelques bugs lors du traitement du déploiement de dossiers , je pense que cela est corrigés dans la dernière version de resharper 7 .

4
Alexander

Essayez ce code pour le chargement (voir ci-dessous). Il recherchera des assemblages indépendants du testeur.

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 )
}
3
Manushin Igor

Vous chargez vos assemblages de manière dynamique à l'aide de Assembly.Load(). Peut-être vous manque une référence à l'Assemblée à charger. Sinon, la copie fantôme peut manquer les assemblys non référencés.

Si vous ne souhaitez pas référencer ces assemblys, veillez à les inclure dans votre projet et à les copier dans le répertoire de sortie. Vous pouvez le faire en définissant la propriété " Copier dans le répertoire de sortie " ou en créant une étape de post-génération personnalisée.

2
Dio F

Il suffit de changer le répertoire en cours 

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

// or
Directory.SetCurrentDirectory(dir);

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

1
RouR

Juste pour compléter la réponse très utile de mcdon, utiliser Assembly.Location donne la réponse correcte selon l'explication de MSFT :

CodeBase est une adresse URL à l'endroit où le fichier a été trouvé, alors que Location est le chemin à partir duquel il a été chargé. Par exemple, si l’Assemblée a été téléchargée à partir d’Internet, sa base de code peut être commencez par “http: //”, mais son emplacement peut commencer par “C: \”. Si la Le fichier a été copié dans l’ombre, l’emplacement serait le chemin de la copie de le fichier dans le répertoire shadow-copy.

Il est également bon de savoir que le codeBase n’est pas garanti. pour les assemblées du GAC. L'emplacement sera toujours défini pour les assemblées chargé à partir du disque, cependant.

Par conséquent, j'utiliserais les éléments suivants:

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

Pour moi, ce qui a été résolu est de définir la propriété "Copy Local" sur true sur la référence nunit.framework.dll du projet test.

0
HS1

Si vous avez un problème d’exécution et de construction après la désactivation de «construction d’ombre» .__, vous devez d’abord choisir «Nettoyer tout» à partir de l’option de construction, puis créer votre projet sur «construction d’ombre», désactiver

0
user7216927