Der angegebene Assemblyname oder die Codebasis ist ungültig. (Ausnahme von HRESULT: 0x80131047)

Der Fehler tritt auf, wenn man versucht per Reflection einen invaliden Typ zu ermitteln. Beispiel:


string typename = "SampleLib.Sample, SampleLib, Version=1.0.0.0,Culture=neutral;PublicKeyToken=1e6becac76b64446";
Type type = Type.GetType(typename);

Der Ursprung des Fehlers liegt hier in einem Tippfehler innerhalb des typname-Strings (; statt ,). Hat mich wertvolle Zeit gekostet, bis ich das gesehen hatte…

Mocken von Klasseninstanzen mit Rhino Mocks

Rhino Mocks lässt sich dazu nutzen, um in Unit Tests Klasseninstanzen zu faken, die nicht von einer abstrakten Klasse oder einem Interface abgeleitet sind. Dazu ein kleines simples Beispiel:


    public class Bl
    {
        public string GetStatus()
        {
            Funktionen funktionen = new Funktionen();

            if (funktionen.LangAndauerndeFunktion())
                return "OK";
            
            return "Nicht OK";
        }
    }

Die Funktion GetStatus erzeugt eine Instanz der Klasse Funktionen und ruft eine Methode auf, die einen boolschen Wert zurückgibt. Basierend darauf wird ein Text zurückgegeben (OK/Nicht OK). Die Klasse Funktionen ist folgendermaßen aufgebaut:


    public class Funktionen
    {
        public bool LangAndauerndeFunktion()
        {
            //Hier wird irgendwas performancelastiges ausgeführt
            //komplizierte Berechnungen, Datenbankzugriffe, etc...

            return true; //Rückgabe, damit das Projekt kompiliert werden kann
        }
    }

Um die Funktion GetStatus mit einem Unit Test abdecken zu können, sind folgende Änderungen nötig:

1. Die Funktion LangAndauerndeFunktion() virtual markieren, damit RhinoMocks diese überschreiben kann.


    public class Funktionen
    {
        public virtual bool LangAndauerndeFunktion()
        {
            //Hier wird irgendwas performancelastiges ausgeführt
            //komplizierte Berechnungen, Datenbankzugriffe, etc...

            return true; //Rückgabe, damit das Projekt kompiliert werden kann
        }
    }

2. Die Instanzierung der Klasse Funktionen in eine Factory-Methode verschieben. Die Methode muss protected virtual sein, um im Unit Test eine gefakte Instanz übergeben zu können.


    public class Bl
    {
        public string GetStatus()
        {
            Funktionen funktionen = GetFunktionenInstance();

            if (funktionen.LangAndauerndeFunktion())
                return "OK";
            
            return "Nicht OK";
        }

        protected virtual funktionen GetFunktionenInstance()
        {
            return new Funktionen();
        }
    }

Für die Erstellung der Unit Tests benötigt man nun eine Hilfsklasse, die von der zu testenden Klasse (in diesem Fall Bl) abgeleitet ist. Diese überschreibt die Funktion GetAusgelagerteFunktionen:


    public class BlTestHelper : Bl
    {
        public Funktionen FunktionenInstance { get; set; }
        protected override Funktionen GetFunktionen()
        {
            return FunktionenInstance ?? base.GetFunktionenInstance();
        }
    }

Die Unit Tests sehen für die GetStatus – Methode der zu testenden BL wie folgt aus:


    [TestFixture]
    public class BlTests
    {
        [Test]
        public void GetStatus_LangAndauerndeFunktionReturnsFalse_ReturnsNichtOk()
        {
            MockRepository mockRepository = new MockRepository();
            Funktionen funktionen = mockRepository.Stub<Funktionen>();

            using (mockRepository.Record())
            {
                SetupResult.For(funktionen.LangAndauerndeFunktion()).Return(false);
            }

            BlTestHelper helper = new BlTestHelper();
            helper.FunktionenInstance = funktionen;

            string status = helper.GetStatus();

            Assert.That(status.Equals("Nicht OK"));
        }

        [Test]
        public void GetStatus_LangAndauerndeFunktionReturnsTrue_ReturnsOk()
        {
            MockRepository mockRepository = new MockRepository();
            Funktionen funktionen = mockRepository.Stub<Funktionen>();

            using (mockRepository.Record())
            {
                SetupResult.For(fFunktionen.LangAndauerndeFunktion()).Return(true);
            }

            BlTestHelper helper = new BlTestHelper();
            helper.FunktionenInstance = funktionen;

            string status = helper.GetStatus();

            Assert.That(status.Equals("OK"));
        }

    }

Zu beachten ist, dass man in den Tests die BlTestHelper – Klasse instanziert und dieser den vom MockRepository erzeugten Stub übergibt. Die Testergebnisse zeigen, dass meine BL wie gewünscht reagiert:
Ergebnisse des Unit Tests