Laden...

Wie kann man ein ResourceDictionary testen

Erstellt von DeSharper vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.777 Views
D
DeSharper Themenstarter:in
40 Beiträge seit 2016
vor 6 Jahren
Wie kann man ein ResourceDictionary testen

Hallo zusammen,

Ich habe in meiner WPF-Application mehrere ResourceDictionaries für verschiedene Skins. Wenn ein anderer Skin ausgewählt wird, binde ich einfach das entsprechende RessourceDictionary ein. In der GUI sind die entsprechenden Styles alle dynamisch, das funktioniert alles soweit. Aber damit das alles fehlerfrei funktioniert, müssen alle verwendeten Styles auch in allen ResourceDictionaries enthalten sein. Falls irgendwo was fehlt, bekomme ich das nicht direkt mit, ich muss die Anwendung starten und mich überall durchklicken und durch Sichtprüfung feststellen, dass alle Elemente da sind... mittelalterlich!

Daher würde ich das gerne testen. Bisher hab ich da an hundsgewöhnliche Unit-Tests gedacht, auch wenn mir schon klar ist, dass die nicht direkt für den Zweck gemacht sind. Wenn an dem Punkt schon jemand eine bessere, praktikable Lösung hat, nur her damit.

Mein Plan war also, Unit Test -> ResourceDictionary erzeugen -> FindResource("besondersTollerButtonStyle")
Leider bekomme ich es nicht hin mir innerhalb eines Unit-Tests ein ResourceDictionary zu erzeugen, wenn ich dem Dictionary eine Source zuweise, dann knallt es immer.

            
string filePath = GetFilepath(ESkin.DefaultSkin);
Uri uri = new Uri(filePath, UriKind.Absolute);
var rd = (ResourceDictionary) Application.LoadComponent(uri);

Fehlermeldung:
=> System.ArgumentException: "Absoluter URI kann nicht verwendet werden."

Den URI hab ich an anderer Stelle getestet, mit einem Reader kann ich auf meine ResourceDictionary-Datei zugreifen, das finde ich aber nicht schön, da müsste ich ja stumpf für jeden gesuchten Style die Datei zeilenweise durchlaufen. Sollte das die einzig mögliche Lösung sein, wäre ich enttäuscht.
Obwohl mir nicht klar ist, warum ich LoadComponent nicht mit einem absoluten URI aufrufen können soll, hab ich also mit relativen URIs experimentiert. Erstmal direkt aus meinem bisherigen absoluten (als korrekt angenommenen) URI:


string filePath = GetFilepath(ESkin.DefaultSkin);
Uri uri = new Uri(filePath, UriKind.Absolute);
Uri uriThis = new Uri(Path.GetDirectoryName((Assembly.GetExecutingAssembly().Location)), UriKind.Absolute);
Uri relativeUri = uriThis.MakeRelativeUri(uri);

=> System.NotSupportedException: "Unbekanntes URI-Präfix."
Auch weitere verzweifelte und unbeholfene Versuche haben mich nicht weitergebracht.

Ich weiß nicht mehr weiter, kann mir sagen, wie man sowas sauber machen würde? Oder zumindest die Fehlermeldungen erklären? Oder mir sagen, an welcher Stelle ich mich verrannt habe?

3.170 Beiträge seit 2006
vor 6 Jahren

Hallo,

hilft Dir das hier?
Can't load ResourceDictionary from within an UnitTest Project

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

D
DeSharper Themenstarter:in
40 Beiträge seit 2016
vor 6 Jahren

den hatte ich auch schonmal gefunden. Aber mein Problem ist ja keine NullReference. Der Pfad an sich, kann nich so verkehrt sein. Mit dem selben pfad kann ich über einen fileReader die datei lesen:


string filePath = GetFilepath(ESkin.DefaultSkin);
FileStream stream = File.OpenRead(filePath);
XamlXmlReader reader = new XamlXmlReader(stream);

while (reader.Read())
{
     ...
}

Davon abgesehen bin ich bei 10 Jahre alten Antworten immer ein bisschen skeptisch 😃 Es gibt jedenfalls bei mir kein TestResults directory mehr. Wo die Tests ausgeführt werden würde ich schon rausbekommen, aber ich hab keine Ahnung was mit "add in the .testrunconfig file" gemeint ist.
Falls das noch aktuell ist, kann mir das jemand erklären?