none
<InternalsVisibleTo ...> RRS feed

  • 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





    Sonntag, 2. März 2014 16:48

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


    Dienstag, 4. März 2014 12:52

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

    Montag, 3. März 2014 13:20
  • Hallo Björn,

    vielen Dank für Deine Antwort. Die von Dir gemachten Vorschläge habe ich schon ausgeführt, aber, wie berichtet, ohne Erfolg.

    Hat noch jemand eine Idee?

    Vielen Dank.

    Michael

    Dienstag, 4. März 2014 09:04
  • 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


    Dienstag, 4. März 2014 12:52