webentwicklung-frage-antwort-db.com.de

Wie teste ich die interne Klassenbibliothek?

Ich möchte eine Klassenbibliothek schreiben, die für mich ein komplexes Objekt erzeugt, aber nur so wenig wie möglich belichtet werden soll. Ich möchte, dass es in andere Projekte aufgenommen wird, und dort habe ich nur einen Aufruf an diese Bibliothek, die z. Gibt mir ein Objekt einer intern erstellten Klasse zurück. Ich möchte nicht zulassen, dass andere diese Objekte explizit erstellen, aber ich möchte dennoch ein Testprojekt für diese Klassenbibliothek erstellen.

Beispielsweise:

var result = Manager.Instance.Create(definition)

Dies sollte der einzige Zugriff auf die Klassenbibliothek sein.

Basierend auf dem Definitionsparameter werden verschiedene Unterklassen zum Erstellen der angeforderten Instanz verwendet und die Eigenschaften entsprechend festgelegt. Daher möchte ich durch Tests irgendwie sicherstellen, dass der gesamte Erstellungsprozess gut funktioniert hat. Da ich aber auch keine sehr kleinen internen Eigenschaften des Ergebnisobjekts verfügbar machen möchte, kann ich nicht nur mit dieser öffentlichen Zugriffsmethode testen, da ich keine Eigenschaften habe, auf die ich mich festlegen kann.

Ich weiß, dass Sie nicht auf interne Mechanik testen sollten und es ist in der Regel schlechtes Design und ich habe auch diesen Artikel durchgelesen, aber es gibt vielleicht keine Möglichkeit, eine Bibliothek plus Unit-Test-Projekt zu erstellen und vielleicht danach den zugriff auf diese klasse einschränken? mit einem Wrapper oder so?

54
Thomas Mondel

In .NET können Sie InternalsVisibleToAttribute in Ihrer Klassenbibliothek verwenden, um Ihre internen Typen für Ihr Komponententestprojekt sichtbar zu machen.

Auf diese Weise können Sie Ihre Klasse intern lassen und sie dennoch von anderen Assemblys verwenden, auf die Sie Zugriff haben.

Du benutzt es so:

[Assembly:InternalsVisibleTo("NameOfYourUnitTestProject")]
132
Wouter de Kort

Für die neuesten csproj 2017-formatierten Projekte, wenn Ihr Projekt nicht das AssemblyInfo.cs Datei können Sie Folgendes hinzufügen:

  <ItemGroup>
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
      <_Parameter1>$(MSBuildProjectName).Tests</_Parameter1>
    </AssemblyAttribute>
  </ItemGroup>

Sie können auch andere Variablen verwenden, um MSBuildProjectName zu ersetzen, z. B. AssemblyName, oder den Namen des unvollständigsten Projekts direkt verwenden.

Sie können das ProjectName.AssemblyInfo.cs im obj Ordner (obj\Debug\netstandard2.0) wurde durch Hinzufügen von InternalsVisibleTo aktualisiert.

4
Feiyu Zhou