A lightweight framework for writing unit tests for Roslyn diagnostic analyzers, code fixes and refactorings using NUnit.
-
Install the RoslynNUnitLight package from NuGet into your project.
-
Create a new class that inherits from one of the provided
*TestFixture
classes that matches what are going to test.DiagnosticAnalyzer
=AnalyzerTestFixture
CodeFixProvider
=CodeFixTestFixture
CodeRefactoringProvider
=CodeRefactoringTestFixture
-
Override the
LanguageName
property and return the appropriate value fromMicrosoft.CodeAnalysis.LanguageNames
, depending on what language your tests will target. -
Override the
CreateAnalyzer
orCreateProvider
method and return an instance of your analyzer or provider. -
Write tests!
RoslynNUnitLight accepts strings that are marked up with [|
and |]
to identify a particular span. This could represent the span of an expected
diagnostic or the text selection before a refactoring is applied.
[Test]
public void AutoPropDeclaredAndUsedInConstructor()
{
const string code = @"
class C
{
public bool MyProperty { get; [|private set;|] }
public C(bool f)
{
MyProperty = f;
}
}";
HasDiagnostic(code, DiagnosticIds.UseGetterOnlyAutoProperty);
}
[Test]
public void AutoPropAlreadyReadonly()
{
const string code = @"
class C
{
public bool MyProperty { get; }
public C(bool f)
{
MyProperty = f;
}
}";
NoDiagnostic(code, DiagnosticIds.UseGetterOnlyAutoProperty);
}
[Test]
public void TestSimpleProperty()
{
const string markupCode = @"
class C
{
public bool P1 { get; [|private set;|] }
}";
const string expected = @"
class C
{
public bool P1 { get; }
}";
TestCodeFix(markupCode, expected, DiagnosticDescriptors.UseGetterOnlyAutoProperty);
}
[Test]
public void SimpleTest()
{
const string markupCode = @"
class C
{
void M()
{
var s = [|string.Format(""{0}"", 42)|];
}
}";
const string expected = @"
class C
{
void M()
{
var s = $""{42}"";
}
}";
TestCodeRefactoring(markupCode, expected);
}