2009-07-20 6 views
1

Ich habe ein paar Methoden, die Reflektion verwenden, um von einem Objekttyp zu einem anderen zu transformieren. Ich bin dabei, die Transformationsmethoden über Moq zu testen und bin auf ein Verhalten gestoßen, mit dem ich nicht umgehen kann. Wenn ich über ein Moq-Objekt reflektiere, um PropertyInfo's zu erhalten, erhalte ich zwei zusätzliche Objekte.Das Reflektieren auf einem Moq-Objekt erzeugt 2 zusätzliche Eigenschaften

  • Moq.Mock``1[Namespace.Class+IElement] Mock
  • Moq.Mock Mock

Der Code, dies zu reproduzieren ist unten:

public void Moq_Reflection() { 
    var realElement = new Stuff(); 

    // Produces 2 items 
    PropertyInfo[] pInfo = realElement.GetType().GetProperties(); 

    var mockElement = new Mock<IElement>(); 
    mockElement.Setup(e => e.Property1).Returns(12); 
    mockElement.Setup(e => e.Property2).Returns(42); 

    // Produces 4 items 
    pInfo = mockElement.Object.GetType().GetProperties(); 
} 

public interface IElement { 
    int Property1 { get; set; } 
    int Property2 { get; set; } 
} 

public class Stuff : IElement 
{ 
    public int Property1 
    { 
     get { return -1; } 
     set { } 
    } 

    public int Property2 
    { 
     get { return -2; } 
     set { } 
    } 
} 

Gibt es eine Möglichkeit auf einem Moq-Objekt zu reflektieren und diese Eigenschaften nicht abrufen?

Antwort

0

nahm ich einen Blick auf den Code in LinqPad, und die einzige Lösung, die ich war, diese beiden Eigenschaften auszuschneiden finden konnten sie auf auszuschließen basierend, ob PropertyType oder Name „Mock“ enthalten. Zum Beispiel:

pInfo.Where(item => item.PropertyType.ToString().Contains("Mock") == false); 
pInfo.Where(item => item.Name.Contains("Mock") == false); 

Es ist grenzwertig hacky, aber es ist das einzige Attribut ich finden kann, filtern. Ich glaube nicht, dass es eine Möglichkeit gibt, die Reflexion selbst zu filtern.

+0

Ich hatte gehofft, es müsste nicht so sein. Es gibt nichts Hässlicheres als Code in Ihrer Haupt-App zu schreiben, um Ihre Tests zu kompensieren. Danke, ich schätze die Hilfe! –

1

ich diesen mehr heute Nachmittag dachte, hier ist also eine andere Idee.

Wenn ich diese Codierung wurde in meinem eigenen Projekt, würde ich den Gegenstandes die Reflexion abstrakt. Ich würde eine Schnittstelle erstellen, die einen Vertrag für eine Klasse definiert, die die Eigenschaften eines Objekts zurückgibt, und dann eine Klasse erstellen, die diese Schnittstelle implementiert, indem Reflektion verwendet wird, um die Eigenschaftengruppe zurückzugeben. Genauso wie das, was Sie wahrscheinlich tun.

Aber dann in den Tests habe ich eine neue Implementierung der Schnittstelle schaffen würde, aber ich in was auch immer Regeln hinzufügen, würde ich unerwünschte Eigenschaften auf meine Mock-Objekte herausfiltern mussten. Mein Live-Code enthält keinen Code, der zum Testen benötigt wird.

Ich hatte gerade heraus, dass die Idee zu bekommen, zu helfen nur versuchen. Viel Glück!

Verwandte Themen