Siguiento la idea del post anterior, de testear cosas con roslyn. Vamos a testear que en todo el proyecto, todos los atributos privados comiencen con _ (guión bajo)
Bueno para esto primero necesitamos 3 dependencias más :
<PackageReference Include="Microsoft.Build.Locator" Version="1.5.5" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.5.0" />
<PackageReference Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="4.5.0" />
Locator es para localizar el sdk y las librerías, pienso no estoy muy seguro que tenemos que hacer esto porque estamos en un test (pero corrijanme si estoy equivocado)
Workspace porque vamos abrir un workspace y msbuild para compilar. (esto esta explicado en este post)
Entonces nuestro test nos queda de la siguiente manera :
[Test]
public async Task The_Field_Private_Should_Start_With_Underscore()
{
// Arrange
string projectPath = @"C:\projects\hat\ArchTestWithRoslyn\test\test.csproj";
MSBuildLocator.RegisterDefaults();
using (var workspace = MSBuildWorkspace.Create())
{
var project = await workspace.OpenProjectAsync(projectPath);
var compilation = await project.GetCompilationAsync();
foreach (var syntaxTree in compilation.SyntaxTrees)
{
var nodeRoot = syntaxTree.GetRoot();
var fields = nodeRoot.DescendantNodes()
.OfType<FieldDeclarationSyntax>()
.Where(field => field.Modifiers
.Any(modify =>
modify.Kind().Equals(SyntaxKind.PrivateKeyword))
&& field.Declaration.Variables
.Any(aVar => !aVar.Identifier.ValueText.StartsWith("_"))
);
// Assert
Assert.IsTrue(!fields.Any());
}
}
}
Este test lo que hace es crear un workspace, importar el proyecto (podemos importar soluciones si quisieramos) y luego obtiene el o los arboles sintacticos y luego busca si existe algun atributo privado que no comience con "_".
Y listo!!