2010-11-29 6 views
2

Gibt es eine Möglichkeit, während der Ausführung festzustellen, ob Code von einer Silverlight Unit Test Framework-Assembly ausgeführt wird? (Für Kontext, ich bin der Hoffnung, einen NinjectModule zu schaffen, die DomainClient an einen FakeDomainClient binden wenn wir die Einheit Test Projekt laufen lassen, sondern binden an die WebDomainClient sonst.)Gibt es eine Möglichkeit zu sagen, ob Code innerhalb des Silverlight Unit Test Framework ausgeführt wird?

+0

+1 NB wir nicht "Danke im Voraus" in der Post, wir upvote die Antworten, die helfen –

Antwort

2

Es ist ein bisschen grob, aber eine Möglichkeit wäre, eine der Eigenschaften (wahrscheinlich LocalPath) von System.Windows.Application.Current.Host.Source zu testen. Sie müssten testen, ob die XAP-Host-Datei das XAP aus Ihrem Testprojekt war oder ob es das XAP für Ihre Anwendung war. Dies würde natürlich eine Annahme über XAP-Dateinamen machen, was es etwas spröde macht (selbst wenn Sie etwas aus dem Namespace abgeleitet haben, der XAP-Dateiname ist in den Projekteigenschaften in jedem Fall konfigurierbar) - also gibt es keine Garantie, dass er immer übereinstimmt).

Alternativ können Sie den Wert von System.Windows.Application.Current.RootVisual testen. Auch hier sollten Sie natürlich nicht vergessen, dass es keine Garantie dafür gibt, dass zukünftige Versionen des Silverlight Unit Test Framework die gleiche Microsoft.Silverlight.Testing.Client.TestPage verwenden werden (obwohl die Überprüfung vielleicht als eine statische Erweiterungsmethode für die Zum Beispiel würde die Anwendungsklasse zumindest bedeuten, dass Sie Ihre Änderungen in Zukunft auf Ihre Erweiterungsmethode (en) beschränken könnten.

Eine andere Alternative wäre, die HTML-Bridge zu verwenden und eine der Eigenschaften von System.Windows.Browser.HtmlPage.Document.DocumentUri zu testen. Dies scheint schlimmer zu sein als die ersten beiden Optionen, da Annahmen über das Hosten von URL-/Seitennamen wahrscheinlich noch schlechter sind als Annahmen über das bestimmte für die Anwendung verwendete UIElement oder den Namen der XAP-Datei.

Jede Lösung, die auf XAP-Dateinamen oder Hosting-Seitennamen basiert, müsste sich in jedem Fall wahrscheinlich auf konventionsbasierte Namen stützen, da Sie diese Technik in Ihren Tests für mehrere Module/Projekte verwenden möchten.

Eine bessere Alternative wäre wahrscheinlich, System.Windows.Application.Current.Host.InitParams zu verwenden. Sie könnten möglicherweise einen bestimmten Parameter auf der Seite innerhalb Ihres Testprojekts übergeben und Ihren Code schließlich den Wert dieses spezifischen Parameters testen lassen. Dies hat den Vorteil, dass keine spezielle RootVisual- oder eine bestimmte Namenskonvention für den XAP-Dateinamen oder den URI-/Seitennamen erforderlich ist.

+0

Wow! Danke Derek! Es fühlt sich für mich so an, als ob die zweite Option am besten wäre, wenn ich es immer noch so machen müsste. Allerdings habe ich meine Strategie für meine Komponententests auf etwas geändert, was Remo im Folgenden vorschlägt. Wenn ich etwas Zeit habe, poste ich ein Beispiel, wie einer Ihrer Vorschläge gemacht werden kann. Danke noch einmal! –

2

Der beste Weg ist, dies überhaupt nicht zu wissen, indem Sie ein gutes Design haben, mit dem Sie den DomainClient in Ihren Tests neu binden können, anstatt in Ihrem Produktionscode zu entscheiden, welche Instanz er verwenden soll. Dies hält Ihren Produktionscode frei von Testcode und reduziert die Wahrscheinlichkeit merkwürdiger Ausnahmen.

Ein Hack wäre, eine statische Klasse mit einer statischen Eigenschaft UnitTestRunning zu erstellen, die standardmäßig falsch ist und im Testinitialisierer auf true gesetzt ist und im Modul gelesen wird.

+0

Hey Remo! Ich stimme Ihnen definitiv zu, dass es besser ist, den DomainClient in meinen Tests erneut zu binden. Ich erkannte, dass ich das in meinem Code tun konnte, und ich habe es entsprechend geändert. Danke für deinen Rat! –

Verwandte Themen