2010-03-25 4 views
5

Das da draußen ein wenig sein könnte, aber ich nehme an Moq in einem Ansichtsmodell verwenden mag, wie so einige Design-Zeitdaten zu erstellen:Verwendung Moq bei Mischung Entwurfszeit

public class SomeViewModel 
{ 
    public SomeViewModel(ISomeDependency dependency) 
    { 
     if (IsInDesignMode) 
     { 
     var mock = new Mock<ISomeDependency>(); 
     dependency = mock.Object; // this throws! 
     } 
    } 
} 

Die Mock-up gesetzt werden kann um etwas zu tun, aber Sie bekommen die Idee.

Mein Problem ist, zur Entwurfszeit in Blend, dass dieser Code eine InvalidCastException wirft, mit der Nachricht entlang der Linien von „Kann nicht das Objekt des Typs‚Castle.Proxies.ISomeDependencyProxy2b3a8f3188284ff0b1129bdf3d50d3fc‘werfen‚ISomeDependency‘zu geben.“ Während dies nicht unbedingt Moq bezogen, sondern Castle verwandt ist, hoffe ich, dass das Moq-Beispiel hilft;)

Eine Idee, warum das ist?

Danke!

Antwort

1

Ich habe ein ähnliches Problem, mit der Ausnahme, dass die Besetzung stammt aus einer dynamisch generierten Assembly (Blend_RuntimeGeneratedTypesAssembly) Typ, der als einer meiner Typen maskiert ist.

Ohne ersichtlichen Grund.

Das treibt mich VERRÜCKT.

+1

verursacht durch Typ Assembly A, das auf das gesamte Framework abzielt, und Entwurfszeitdatenprojekt B, das auf die Client Factory abzielt. Verursacht alle möglichen seltsamen Scheiße. – Will

1

Ich dachte, dass ich diese Art von Trick machen musste, aber nachdem ich viel experimentiert und gesucht habe, entdeckte ich, dass Blend 4 jetzt Entwurfszeit-Beispieldatenkontexte basierend auf einer vorhandenen Klasse erstellen kann.

Diese effektiv gibt Ihnen eine Dummy-Klasse, die genau wie Ihre VM Klasse sieht so, dass Sie Ihre Bindung usw.

hinzufügen Es funktioniert gut genug, dass dies die Technik ist, dass wir nun empfehlen.

Ein möglicher Nachteil ist, dass, wenn Sie Ihre reale VM für eine Art von Interaktivität benötigen, der Proxy das natürlich nicht tun kann - Sie müssten Werte manuell ändern oder zu einem anderen Design-Zeitobjekt wechseln . Aber in der Praxis bin ich selten auf dieses Szenario gestoßen. In den meisten Fällen legen Sie den Zustand der VM fest und brauchen dann eine Ewigkeit, um das richtige Aussehen zu erhalten.

1

aktualisieren: auf GitHub veröffentlicht: https://github.com/GeniusCode/GeniusCode.Components.DynamicDuck

Ich lief auch ein ähnliches Problem in beim Schloss zu mock Viewmodels zur Entwurfszeit zu nutzen versuchen. Wir haben unsere eigene msil duck/mock-Bibliothek geschrieben, und es funktioniert gut für diesen Zweck.

ich darüber gebloggt hier: http://blogs.geniuscode.net/JeremiahRedekop/?p=255

Wir arbeiten daran, die Bibliothek unter MS-PL zu lösen und auf GitHub bereitstellen.

Verwandte Themen