CS0122 beim Schreiben grundlegender Unit-Tests auf die „Standardmethode“ für VS2022 und VS2025C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 CS0122 beim Schreiben grundlegender Unit-Tests auf die „Standardmethode“ für VS2022 und VS2025

Post by Anonymous »

Die Informationen in den ersten relevanten Fragen und Antworten, von denen ich festgestellt habe, dass „InternalsVisibleTo“ nicht funktioniert, sind ziemlich veraltet. Normalerweise teste ich Code nur mit Druckanweisungen und #debug-Präprozessorwächtern, aber ein ziemlich kniffliges Problem hat mich in das Kaninchenloch der Unit-Test-Funktionalität geführt.
Allein das Befolgen des grundlegenden Tutorials führt mich zu einem schwer zu behebenden Fehler und nicht zu der demonstrierten Ausgabe.
Nehmen wir an, ich erstelle ein einfaches VS-C#-Projekt und verwende Code wie diesen (z. B. einen einfachen Beispielpunkt). Struktur, das einfachste, was nur zu Demonstrationszwecken schief geht):

Code: Select all

namespace myProject {
struct myPoint {
int x;
int y;
public myPoint(int newX, int newY) {
x = newX; y = newY;
}
// (... implement add, subtract, equals, etc...)
}
}
Als nächstes würde ich eine Testklasse schreiben, die standardmäßig so aussehen würde ... (Wiederum hauptsächlich im Anschluss an die grundlegende Demonstration)

Code: Select all

using myProject;
namespace myProjectTest {
[TestClass]
public sealed class myProjectTest {
[TestMethod]
public void TestAddingPoints() {
myPoint pt = new myPoint();
// Test code goes here.
}
}
}
So schön und sauber das auch scheint und aussieht, das... geht schief. Sie erhalten den CS1022-Fehler „Aufgrund der Schutzstufe nicht zugänglich“, was verwirrend sein kann. Und die Suche führt Sie in ein Labyrinth aus Handfeuerwaffen und veralteten Ratschlägen, da sich die Art und Weise, wie Projekte in Visual Studio im Laufe der Zeit intern funktionieren, mehrfach geändert hat und es mehrere Abstraktionsebenen zwischen Ihnen und dem gibt, was der Compiler tun soll.
Der Versuch, Änderungen vorzunehmen, um den Fehler auf den unteren Ebenen zu beheben (z. B. das manuelle Erstellen einer benutzerdefinierten „assemblyInfo.cs“), kann dazu führen, dass entweder diese Änderungen überschrieben werden oder Sie einige verlieren andere Funktionen innerhalb der IDE (da Dinge, die Sie in bestimmten Bildschirmen tun, in „assemblyInfo.cs“ landen, wie z. B. die Angabe Ihrer Versionsnummer). Das scheint der falsche Ansatz zu sein.
Auf der Suche nach sinnvollen Standardwerten ist es im Jahr 2025 eine gute Möglichkeit, einfach ein Unit-Test-Projekt zu schreiben und anstatt einen eigenen Plan zu entwickeln, die bereits bereitgestellten Standardvorlagen usw. zu verwenden, um Ihren Code effektiv zu testen, ohne viel Zeit damit zu verschwenden, die (sehr, sehr komplizierten) Interna der Assembly-Signatur und die Art und Weise, wie Projektdateien zusammen kompiliert werden, zu verstehen, ohne dabei etwas zu tun wie „Einfach alles als öffentlich markieren“, wenn das Ziel darin besteht, irgendwann Produktionscode schreiben zu können, der nicht nur alle darin enthaltenen Methoden ankündigt. Abgesehen von den IP-Aspekten gibt es auch die Unpraktikabilität, interne Methoden, die für einen Verbraucher nutzlos sind, nicht zu verbergen.
Einige Recherche: Indem ich einfach eine Referenz in VS hinzufüge und wenn ich in den Dateien für InternalsVisibleToAttribute wühle, finde ich Folgendes, was ich laut Online-Quellen zur .csproj-Datei hinzufügen könnte:

Code: Select all

  

MyProjectTest


Wenn Sie genau genug blinzeln, ähnelt dies einigen Dingen in der verlinkten Frage, ist aber auf jeden Fall ganz anders. Es gibt etwa ein Jahrzehnt an Änderungen, die die „Standardmethode“ stark verändert haben. Aber was ist die moderne Standardmethode?
Das ist nicht das oben Genannte, weil es nicht funktioniert (Überraschung, 2019 ist auch zu sehr veraltet). Ich konnte nichts Neues finden, das mir die Syntax erklärt.
Ich habe auch ein anderes Benennungsschema ausprobiert, bei dem ich mein Testprojekt benenne

Code: Select all

myProject.tests
Anstatt den Unterstrich zu verwenden (ich dachte, eine Art „untergeordneter“ Namespace würde die Probleme beheben), aber ohne Erfolg. Fortsetzung CS0122, es sei denn, ich markiere alles als öffentlich.
Eine (zugegebenermaßen sehr alberne) Möglichkeit, das Problem zu lösen, besteht darin, einfach
einzugeben

Code: Select all

[assembly: InternalsVisibleTo("myProject.tests")]
Oben in buchstäblich jeder Datei des Projekts, das Sie in Tests verwenden. Es fühlt sich sehr an wie in den 1970ern, also muss es eine bessere Lösung geben, oder?
Wenn es relevant ist, ist die .NET-Version normalerweise 4.8 (letzte Version mit vollständiger Win-API).

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post