2

J'écris un service Windows relativement petit et simple, et en utilisant des taupes pour simuler des tests unitaires. En raison du petit code, j'ai décidé d'utiliser l'instrumentation Moles, plutôt que de segmenter le code avec des stubs. Lorsque j'exécute un test unitaire contre l'ensemble moled, je reçois une erreur:Moles VS2010 Tests unitaires du service Windows échoue

InitilaizationDetectsMissingMonitorDirectory has failed: Test method FtpDirWatcher.Test.FileWatcherTest.InitilaizationDetectsMissingMonitorDirectory threw exception: Microsoft.Moles.Framework.Moles.MoleInvalidOperationException:

Moles requires tests to be IN an instrumented process.

In Visual Studio Test, add the following attribute your unit test method:

[TestMethod]

[HostType("Moles")] // add this attribute

public void Test() { ... }

Je ne suis pas sûr de ce que cela signifie que « taupes nécessite des tests pour être EN un processus instrumenté. » Notez que "IN" signifie que ce n'est pas l'habitude "Moles nécessite des tests pour être un processus instrumenté." J'ai regardé en arrière la documentation, pour voir si j'ai manqué quelque chose. Il me manque évidemment quelque chose d'important.

L'assembly cible ("FtpDirWatcher") est en effet instrumenté par Moles (attesté par la présence de l'objet MFileWatcher), et j'ai les attributs appropriés en place sur la méthode de test. J'ai même essayé de convertir la propriété cible à une méthode, en vain. Alors que se passe-t-il?

Ceci est un code condensé, donc pas de critique!

using System; 
using System.IO; 
using System.Linq; 
using FtpDirWatcher.Moles; 
using Microsoft.Moles.Framework; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
[assembly: MolesAssemblySettings(Bitness = MolesBitness.AnyCPU)] 

namespace .Test // Test project namespace 
{ 
    [TestClass] 
    public class FileWatcherTest 
    { 
     readonly string _invalidDirectory = @"B:\invaliddirectory"; 

     [TestMethod] 
     [DeploymentItem("FileWatcher.exe")] 
     [HostType("Moles")] 
     public void InitilaizationDetectsMissingMonitorDirectory() 
     { 
      Assert.IsFalse(Directory.Exists(_invalidDirectory)); 

      // THE FOLLOWING LINE OF CODE THROWS THE ERROR. 
      // Use moles to detour the MonitorDirectory property's Get 
      // method to a delegate. 
      MFileWatcher.AllInstances.MonitorDirectoryGet = watcher => 
       new DirectoryInfo(_invalidDirectory); 

      // Don't use the accessor -- no private fields are accessed. 
      var target = new FileWatcher(); 
      Assert.IsFalse(target.IsConfigurationOk); 
     } 
    } 
} 

Toute aide est appréciée!

MISE À JOUR: Ajout de la sortie de construction suivante. Inclus le paramètre bitness dans le code, ci-dessus, pour montrer qu'il ne devrait pas être un problème.

------ Rebuild All started: Project: Common, Configuration: Debug x86 ------

Common -> C:...\Common\bin\x86\Debug\Common.dll

------ Rebuild All started: Project: FtpDirWatcher, Configuration: Debug x86 ------

FtpDirWatcher -> C:...\FtpDirWatcher\bin\Debug\FtpDirWatcher.exe

------ Rebuild All started: Project: FtpDirWatcher.Test, Configuration: Debug x86 ------

Microsoft Moles v0.94.51023.0 - http://research.microsoft.com/moles - .NET v4.0.30319

Copyright (c) Microsoft Corporation 2007-2010. All rights reserved.

00:00:00.00> moles

Moles : info : metadata : ignoring reference C:\...\FtpDirWatcher.Test\MolesAssemblies\FtpDirWatcher.Moles.dll 

Moles : info : metadata : incompatible assembly bitness, using reflection only 

Moles : info : metadata : loading C:\...\FtpDirWatcher\bin\Debug\FtpDirWatcher.exe (reflection only) 

Moles : info : compilation : output assembly name: FtpDirWatcher.Moles 

Moles : info : code : found 4 types 

Moles : info : code : visibility: exported or assembly(FtpDirWatcher.Moles) 

00:00:00.37> code generation 

    Moles : info : code : generating code at C:\...\FtpDirWatcher.Test\obj\x86\Debug\Moles\befw\m.g.cs 

    00:00:00.52> stubs generation 

    Moles : info : code : generated 2 stub types 

    00:00:00.89> moles generation 

    Moles : info : code : generated 2 mole types 

00:00:01.45> compiling 

    Moles : info : compilation : Moles assembly: C:\...\FtpDirWatcher.Test\MolesAssemblies\FtpDirWatcher.Moles.dll 

00:00:02.37> moles generator 0 errors, 0 warnings

FtpDirWatcher.Test -> C:...\FtpDirWatcher.Test\bin\x86\Debug\FtpDirWatcher.Test.dll ========== Rebuild All: 3 succeeded, 0 failed, 0 skipped ==========

Répondre

1

Il s'agit d'une solution complète pour le visage et la paume. J'ai réalisé que j'exécutais des tests en utilisant le DevExpress Tools for Visual Studio glyphes de compléments (icônes) qui sont placés dans la fenêtre de code IDE, à côté des méthodes de test et des classes. Le programme d'installation Moles modifie les outils de test Visual Studio pour inclure des paramètres et des commutateurs pour l'adaptateur hôte Moles. Cependant, DevExpress n'a pas été modifié.

Deux solutions sont possibles:

  1. exécuter simplement des tests Moles en utilisant les outils de test de Visual Studio directement
  2. Outils Modifier DevExpress pour Visual Studio pour utiliser correctement l'hôte taupes

Un détail aperçu et exemple de code est sur mon blog, The Curly Brace: http://thecurlybrace.blogspot.com/2011/05/moles-requires-tests-to-be-in.html

Questions connexes