2016-06-26 5 views
1

Ich habe ein Problem mit einem Komponententest aufgrund eines expliziten Cast-Fehler einer Schnittstelle. Ich bin mir nicht sicher, ob es dafür eine Lösung gibt, aber ich habe noch keine klar genug für mein spezielles Szenario gefunden.Einheit Test explizite Cast-Fehler auf der Schnittstelle

In meinem Konstruktor gebe ich die generische Schnittstelle des Datenmodells ein. Später habe ich dieses Idatamodell dann explizit auf meine spezifische Implementierung übertragen. Dies kann nicht zur Laufzeit in meinem Komponententest ausgeführt werden.

 public EventFinder(IEventFinder Successor, 
            IAssetDataModel theAssetDataModel, 
            IAssetEventHandler theEventHandler) 
     : base(Successor, theAssetDataModel, theEventHandler) 
    { 
    } 

//later on in the I call this cast to reference the model and method I need 
       Listofstuff = ((IMyOtherDataModel)_AssetDataModel).GetListofStuff(); 

Hier ist der Fehler in meinem Komponententest fehlgeschlagen. Ich habe einen Stub dieser Methode, aber es versagt die explizite Besetzung zur Laufzeit und ich bin immer noch ein wenig verwirrt, warum. Ich habe einen Stummel dieses Modells in der Unit-Test, aber es immer noch nicht

  var stub_my_Data_model = new StubImyAssetDataModel(); 
     stub_my_Data_model.Getstuff =() => 
      { 
       List<string> results = new List<string>(); 
       results.Add("test1"); 
       return results; 
      }; 
+3

Nun, Sie übergeben etwas, das vermutlich * nicht ist ein 'IMyOtherDataModel', so dass die Besetzung fehlschlägt. Warum sollten Sie erwarten, dass es funktioniert? Und noch wichtiger, warum nimmt Ihr Konstruktor nur "IAssetDataModel", wenn Sie später davon ausgehen, dass es ein "IMyOtherDataModel" sein muss? –

+0

Danke für die Antwort. Ich verstehe, dass es komisch aussieht, aber ich habe immer noch Probleme damit herumzukommen und ich weiß, dass es eine Lösung gibt. Das IAssetDataModel ist die Schnittstelle, von der alle anderen Datenmodelle erben. Dies gibt der Methode, die es aufruft, Flexibilität. Ich kann MyDataModel wegen der Vererbung anderer Methoden nicht übergeben. Nochmals vielen Dank für Ihre Antwort – Momthemeatloaf

+0

Sie sind * wirklich * geben dem Anrufer Flexibilität. Sie geben die Illusion der Flexibilität. Du sagst: "Sicher, gib mir irgendein Datenmodell, das du willst. Das ist in Ordnung. Ich werde nur bis später warten, bevor ich versage, wenn du mir nicht die Art von Datenmodel übergeben hast, die ich wirklich brauche." Warum akzeptierst du Werte, die du nicht nutzen kannst? –

Antwort

0

ich einige graben tat und die Antwort ist nur eine Implementierung des Datenmodells in der Testklasse zu erstellen, die von der Schnittstelle leitet.

public class TestDataModel : IMyInterface{} 
Verwandte Themen