10sept. 2015

Unity : tester l'instanciation des classes

Cela fait plusieurs fois que je rencontre le problème des enregistrements manquants dans Unity. Le projet se lance et on obtient l'erreur suivante :

Resolution of the dependency failed, 
    type = "MyAssembly.IMyTypeName", name = "(none)".
Exception occurred while: while resolving.
Exception is: InvalidOperationException - The current 
    type, MyAssembly.IMyTypeName, is an interface 
    and cannot be constructed. Are you missing 
    a type mapping?

Les applications en entreprise nécessitent souvent que des webservices soient lancés, des cas de tests créés etc ... .

Mettre toutes ces conditions en place prends du temps - pour parfois aboutir à ce message d'erreur, et être obligé de tout recommencer.

Heureusement il est possible d'automatiser.

Régler le problème d'un test unitaire

Pour pallier à cette perte de temps, voici un test unitaire qui instancie tous les types définis dans Unity.

J'utilise dans cet exemple MSTest comment moteur de test et FluentAssertions comme librairie d'assertion (plus lisible que la librairie d'assertion classique).

La collection _typeToExclude donne la possibilité d'exclure certains types au cas où.

[TestClass]
public class UnityConfigTest
{
    private readonly ISet<Type> _typeToExlude 
        = new HashSet<Type> { typeof(ITypeNotCreatable) };

    [TestMethod]
    public void Should_instanciate_all_part_in_unity()
    {
        // ARRANGE
         UnityContainer container = new UnityContainer();

        // ACT
        Action ac = () => container.LoadConfiguration();
        ac.ShouldNotThrow();

        foreach (ContainerRegistration currentRegistration 
            in container.Registrations)
        {
            Type typeToInstanciate = currentRegistration.RegisteredType;

            if (!_typeToExlude.Contains(typeToInstanciate))
            {
                try
                {
                    Trace.WriteLine("Instanciating " + typeToInstanciate.ToString());

                    object instance = container.Resolve(typeToInstanciate);

                    // ASSERT
                    instance.Should().NotBeNull();
                }
                catch (Exception ex)
                {
                    // If anything odd happens, make the test fail
                     Assert.Fail(ex.Message);
                }
            }
        }
    }
}

Enjoy !

aucun commentaire

Fil des commentaires de ce billet

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.