Im Rahmen von Unit Tests können auch Testdaten für eine generierte Schlüsseltabelle verwendet werden. Analog zum Bausteinaufruf, kann für eine Schüsseltabellen-Instanz, bzw. alle Instanzen einer Schlüsseltabelle, eine Mockup Funktion registriert werden, die die Einträge für die Schlüsseltabelle liefert. Diese Funktion bekommt die Schlüsseltabellen-Instanz und Informationen über den Testlauf des Unit Test übergeben, und kann dann selbst entscheiden, welche Daten für diese Schlüsseltabelle in dem jeweiligen Testlauf verwendet werden, bzw. wo die Daten herkommen.
Die Funktion, die die Testdaten für eine generierte Schlüsseltabelle liefert, hat folgende Signatur:
TRec[] MockupFunction(T table, ModuleUnitTestAttribute unitTest); where T : Reftab.Base<T, TRec> where TRec : struct
Das Typargument T
ist der generierte Datentyp für die Schlüsseltabelle, und das Typargument TRec
ist der generierte Datentyp für einen Eintrag in der Schlüsseltabelle.
Die Funktion bekommt 2 Argumente übergeben. Das Argument table
ist eine Referenz auf die Schlüsseltabellen-Instanz, für die Testdaten verlangt werden. Das Argument unitTest
ist eine Referenz auf das ModuleUnitTestAttribute
, wofür die Mockup Funktionen gerufen wird.
Sie wird aufgerufen, wenn die Einträge für table
verlangt werden, und liefert die Einträge zurück, welche für den Unit Test verwendet werden sollen. In der Funktion kann auf den Originaleinträge von table
zugegriffen werden, um z.B. eine eingeschränkte Menge von bzw. angepasste Originaleinträge zurückzuliefern.
Hier ein Beispiel für eine Mockup-Funktion für die Schlüsseltabelle GEVO-STATUS (VOGST):
private static GevoStatusRec[] MockupTest_Mock(GevoStatus table, ModuleUnitTestAttribute unitTest) { if (unitTest.Tag == "extern") { // Lese XML datei/datenbank/mdb/.... return LeseDaten(); } if (unitTest.Tag == "replace") { // Nehme normale Daten mit Anpassungen return table .Select(row => row.GevoStArtK == "1" && row.GevoStArtRst == "0" ? GevoStatus.CreateRow(row.GevoStArtK, row.GevoStArtRst, "xZuge", "xZugeordnet", row.GevoStK, row.GevoKz) : row) .ToArray(); } // liefere fest verdrahte Daten return [ GevoStatus.CreateRow("1", "0", "Zuge", "Zugeordnet", "10", "N"), GevoStatus.CreateRow("1", "1", "Bat", "Batchverarbeitung anstehend", "11", "N"), GevoStatus.CreateRow("1", "2", "Ibea", "in Bearbeitung", "12", "N"), GevoStatus.CreateRow("1", "3", "Zbea", "Weitergeleitet", "13", "N"), GevoStatus.CreateRow("1", "8", "Fehl", "Fehler", "18", "N"), GevoStatus.CreateRow("2", "0", "Wvl", "Wiedervorlage", "20", "J"), GevoStatus.CreateRow("2", "1", "WvlE", "Eingang/Wiedervorlage", "21", "N"), GevoStatus.CreateRow("3", "0", "Aban", "zur Abarbeitung anstehend", "30", "N"), GevoStatus.CreateRow("8", "8", "Abbr", "Abbruch", "88", "N"), GevoStatus.CreateRow("9", "0", "Undu", "Undurchführbar", "90", "J"), GevoStatus.CreateRow("9", "4", "Gelö", "Gelöscht", "94", "J"), GevoStatus.CreateRow("9", "8", "Erl", "Erledigt", "98", "J"), ]; }
CreateRow
, die hier verwendet wird, um einen Eintrag für die Schlüsseltabelle zu erstellen, kann nur in bzw. unterhalb der Mockup Funktion aufgerufen werden, während ein Unit Test ausgeführt wird. In alle anderen Fällen wird eine InvalidOperation-Ausnahme aufgeworfen.
Und hier ein Beispiel, wie diese Mockup-Funktion in einem Module Unit Test verwendet wird:
private void MockupTest_prepare() { this.Test.RegisterMockup<GevoStatus, GevoStatusRec>(MockupTest_Mock); } private void MockupTest_cleanup() { this.Test.UnregisterMockup<GevoStatus, GevoStatusRec>(); } [ModuleUnitTest(description: "Test mit extern Daten", tag: "extern")] [ModuleUnitTest(description: "Test mit angepassten Daten", tag: "replace")] [ModuleUnitTest(description: "Test mit fest verdrahten Daten")] private void MockupTest() { var table = GevoStatus.New(); var contains = table.Contains("2", "0"); }
An der Klasse TestSupport
sind Methoden definiert, um eine Mockup-Funktion für einen Unit Test zu registrieren. Sie können nur während eines Unit Test bzw. in der ''prepare''/''cleanup'' Methoden für einen Unit Test verwendet werden. In allen anderen Fällen wird eine Condition (ZZTAAIM2(72)
, bzw. ZZTAAIM2(80)
) aufgeworfen.
bool RegisterMockup<T, TRec>(T table, Func<T, ModuleUnitTestAttribute, TRec[]> mockFunc); where T : Reftab.Base<T, TRec> where TRec : struct bool RegisterMockup<T, TRec>(Func<T, ModuleUnitTestAttribute, TRec[]> mockFunc); where T : Reftab.Base<T, TRec> where TRec : struct
Registriert eine Mockup-Funktion für eine generierte Schlüsseltabellen-Instanz, bzw. alle Instanzen einer generierten Schlüsseltabelle.
bool UnregisterMockup<T, TRec>(T table); where T : Reftab.Base<T, TRec> where TRec : struct bool RegisterMockup<T, TRec>(); where T : Reftab.Base<T, TRec> where TRec : struct
Entfernt eine vorher registrierte Mockup-Funktion für eine generierte Schlüsseltabellen-Instanz, bzw. alle Instanzen einer generierten Schlüsseltabelle.