Benutzer mit den meisten Antworten
<InternalsVisibleTo ...>

Frage
-
Hallo zusammen,
ich bin gerade am rumüben und ausprobieren von Unit Tests. Das Logik-Projekt, welches die zu testenden Methoden beinhaltet, heißt Stubs. Das Projekt mit den Unit Tests heißt Stubs.Tests. Beide Assemblys sind signiert.
Ich möchte nun mit der Unit Test-Klasse auf die internen Methoden des Logik-Moduls zugreifen. Dazu habe ich in der Datei AssemblyInfo.vb des Projekts Stubs das <InternalsVisibleTo>-Attribut eingetragen (den PublicKey habe ich verkürzt):
<Assembly: InternalsVisibleTo("Stubs.Tests, PublicKey = 0024...f192")>
Die Assembly Stubs enthält eine Klasse namens ReadFileConstructorInjection, die von Stubs.Tests getestet werden soll. Hier der Code der Klasse ReadFileConstructorInjection:
Class ReadFileConstructorInjection Friend Sub New() ... End Sub Public Sub New(nA As INetworkAccess) ... End Sub End Class
(der Code innerhalb der Konstruktoren ist uninteressant; es geht nur um den Zugriff durch die Stubs.Tests-Assembly).
Die Klasse hat keinen eigenen Zugriffsmodifizierer, standardmäßig wird also Friend verwendet. Der erste Konstruktor verwendet Friend als Zugriffsmodifizierer, der zweite Public.
Hier der Code der Assembly Stubs.Tests:
Public Shared Sub Main() Dim rF As ReadFileConstructorInjection = New ReadFileConstructorInjection() End Sub Public Sub ReadFileConstructorInjection_FileExists_ReturnsTrue() Dim rF As ReadFileConstructorInjection = New ReadFileConstructorInjection(stubNA) End Sub
Bei beiden Dim-Anweisungen wird das fett gedruckte "ReadFileConstructorInjection" mit einer blauen Wellenlinie unterstrichen: "Stubs.ReadFileConstructorInjection ist in diesem Kontext nicht zugreifbar, da es sich um Friend handelt."
Ich habe der Klasse/dem Konstruktor auch schon "Protected Friend" vorangestellt, was aber auch nicht von Erfolg gekrönt wurde.
Ändere ich den Konstruktor der Klasse ReadFileConstructorInjection auf "Public"
Public Class ReadFileConstructorInjection Friend Sub New() ... End Sub Public Sub New(nA As INetworkAccess) ... End Sub End Class
wird in Stubs.Tests nur der fettgedruckte Teil in der Sub Main mit der Meldung "Meldung: "Fehler bei der Überladungsauflösung, da keine zugreifbare "New" diese Anzahl von Argumenten akzeptiert" blau unterkringelt:
Public Shared Sub Main() Dim rF As ReadFileConstructorInjection = New ReadFileConstructorInjection() End Sub Public Sub ReadFileConstructorInjection_FileExists_ReturnsTrue() Dim rF As ReadFileConstructorInjection = New ReadFileConstructorInjection(stubNA) End Sub
Somit scheint die Assembly Stubs.Tests trotz <InternalsVisibleTo> nicht auf Stubs zugreifen zu können (auch nicht ohne Signierung).
Kann mir bitte jemand vom Schlauch herunter helfen?
Vielen Dank.
Gruß
Michael
- Bearbeitet Bayer, Michael Sonntag, 2. März 2014 17:00
Antworten
-
Die Lösung ist so peinlich, dass ich mich fast nicht traue, sie aufzuschreiben:
Im Attribut InternalsVisibleTo wird die Klasse Stubs.Tests angegeben:
<Assembly: InternalsVisibleTo("Stubs.Tests, PublicKey = 0024...f192")>
Tatsächlich benannt hatte ich sie allerdings mit Stubs.Test.
Nach der Korrektur des Schreibfehlers funktioniert alles wie gewünscht.
Gruß
Michael
- Als Antwort markiert Bayer, Michael Dienstag, 4. März 2014 12:52
- Bearbeitet Bayer, Michael Dienstag, 4. März 2014 12:53
Alle Antworten
-
Hi Michael,
den Fehler das es nicht Funktioniert wenn jetzt so nicht Nachfolziehen. Da schau mal bitte ob du ihn wirklich auf Public gesetzt hast und nicht villeicht aus versehen auf private.
Beim unsegnierten verwende mal bitte nur den Assembly Name beim VisibelTo.
Und beim Signierten brauchst du ihn. Wenn das mit dem Unsegnierten Klappt. Erzeug dir mal den Schlüssel neu.
Es gibt ein paar Änderungen die den Key des Assemblies verändern. Wenn ich das richtig im Kopf habe z.B. die Versions nummer.
MFG
Björn
-
Die Lösung ist so peinlich, dass ich mich fast nicht traue, sie aufzuschreiben:
Im Attribut InternalsVisibleTo wird die Klasse Stubs.Tests angegeben:
<Assembly: InternalsVisibleTo("Stubs.Tests, PublicKey = 0024...f192")>
Tatsächlich benannt hatte ich sie allerdings mit Stubs.Test.
Nach der Korrektur des Schreibfehlers funktioniert alles wie gewünscht.
Gruß
Michael
- Als Antwort markiert Bayer, Michael Dienstag, 4. März 2014 12:52
- Bearbeitet Bayer, Michael Dienstag, 4. März 2014 12:53