2009-04-16 4 views
0

Ich habe zwei Klassen wie folgt aus (im aktuellen Projekt):Wie kann ich generische Argumente vor einer verkorkste von VS2008 Unit-Tests verhindern

namespace app { 
    internal class A { 
    } 

    internal class B { 
     private List<A> list; 
     private void SomeMethodToTest() { 
      list = new List<A>() { new A() }; 
     } 
    } 

Das ich meine Unit-Test wie

suchen etwas haben
[TestClass()] 
public class ATest { 
    [TestMethod()] 
    public void TestSomeMethod() { 
     B_Accessor b = new B_Accessor(); 
     b.SomeMethodToTest(); 
     Assert.AreEqual(1, b.list.Count); // ERROR ON THIS LINE 
    } 
} 

In der markierten Zeile bekomme ich eine InvalidCastException, die etwas sagt wie: "Objekt vom Typ System.Collections.Generic.List1 [app.A] kann nicht umgewandelt werden, um System.Collections.Generic.List1 [app.A_Accessor] einzugeben ]

Das Problem ist, dass, weil ein internes ist, die automatisch generierte Klasse B_Accessor wie

[Shadowing("app.B")] 
public class B_Accessor : BaseShadow { 
    ... stuff ... 

    [Shadowing("list")] 
    public List<A_Accessor> list { get; set; } 

    ... stuff ... 
} 

Hinweis sieht, dass in der Accessor-Klasse, die Liste der Typ-Liste ist <A_Accessor> und nicht die Liste <A>. Ich habe das InternalsVisibleTo-Attribut für die Anwendung angegeben, sodass das Testprojekt auf den Typ A zugreifen kann. Aus irgendeinem Grund ersetzt VS es jedoch durch den Zugriffstypen, wodurch der Typ mit dem umschlossenen Typ inkompatibel wird.

Wie kann ich das umgehen, anstatt A öffentlich zu machen?

Antwort

0

Ich habe meine vorherige Antwort gelöscht, weil ich nicht bemerkt hatte, dass Sie bereits InternalsVisibleToAttribute verwendet haben.

Was generiert diese "Accessor" -Klassen? Wenn Sie sagen "VS ersetzt es durch den Accessor-Typ" meinen Sie, dass es Ihren Quellcode ändert? Das klingt sehr merkwürdig - was passiert, wenn Sie es zurück setzen, nur A und B anstelle von A_Accessor und B_Accessor zu verwenden?

Wenn Sie möglicherweise automatisch generierte Klassen loswerden, die gemeint sind aussehen wie die echten, aber nicht ganz, dann loswerden sie. Ich vermute, das ist nur eine Situation, wo sie Probleme verursachen werden.

Ich hatte noch nie Probleme nur mit InternalsVisibleTo und Testen der internen Mitglieder direkt. (Na ja, R # bekam manchmal in einer früheren Version verwirrt, aber abgesehen davon, dass ...)

+0

VS erzeugt die Zugriffsklassen automatisch zu ersetzen, wenn die Testprojekt wird gebaut. Ich kann B statt B_Accessor nicht verwenden, da ich auf ein privates Mitglied zugreifen möchte. – erikkallen

+0

OK, wie testen Sie eine private Methode? Ich würde es vorziehen, die Kapselung nicht zu unterbrechen, damit die Tests funktionieren. – erikkallen

+0

http://stackoverflow.com/questions/250692/how-do-you-unit-test-private-methods – JeffH

0

Es ist möglich, das Testprojekt mit so etwas wie

internal static class AccessorExtensionMethods { 
    internal static List<A> Get_list(this PrivateObject po) { 
     return (List<A>)po.GetField("list"); 
    } 
} 

[TestClass()] 
public class ATest { 
    [TestMethod()] 
    public void TestSomeMethod() { 
     PrivateObject bpo = new PrivateObject(new B()); 
     B_Accessor b = new B_Accessor(bpo); 
     b.SomeMethodToTest(); 
     Assert.AreEqual(1, bpo.Get_list().Count); 
    } 
} 
Verwandte Themen