参照 : Damir’s Corner – Quick Guide to Unit Testing Diagnostic Analyzers
Visual Studio 2015 RC にて、.NET Compiler Platform SDK Templates for RC の「Analyzer with Code Fix」テンプレートで Analyzer 用のプロジェクトを作成すると、自動的にテストプロジェクトも生成されます。
んでもってこれを使ってテストコードを書くわけですが、どうやらここでテストコードに与えるソース文字列がコンパイル通らないコードだとテストに失敗することがあるようです。
で、アセンブリ参照が足りない場合なんかも同様にコケるわけですが、テストプロジェクトにアセンブリ参照を追加しても残念ながら参照してくれません。
ではどうすれば良いかというと、テストプロジェクトの Helpers/DiagnosticVerifier.Helper.cs
内の CreateProject
メソッドにアセンブリ参照を追加している箇所があるので、そこに追加します。
[csharp mark=”4-7,23-24″]
public abstract partial class DiagnosticVerifier
{
//中略
private static readonly MetadataReference KanColleViewerCompositionReference
= MetadataReference.CreateFromAssembly(typeof(Grabacr07.KanColleViewer.Composition.IPlugin).Assembly);
private static readonly MetadataReference SystemComponentModelCompositionReference
= MetadataReference.CreateFromAssembly(typeof(System.ComponentModel.Composition.ExportAttribute).Assembly);
//中略
private static Project CreateProject(string[] sources, string language = LanguageNames.CSharp)
{
string fileNamePrefix = DefaultFilePathPrefix;
string fileExt = language == LanguageNames.CSharp ? CSharpDefaultFileExt : VisualBasicDefaultExt;
var projectId = ProjectId.CreateNewId(debugName: TestProjectName);
var solution = new AdhocWorkspace()
.CurrentSolution
.AddProject(projectId, TestProjectName, TestProjectName, language)
.AddMetadataReference(projectId, CorlibReference)
.AddMetadataReference(projectId, SystemCoreReference)
.AddMetadataReference(projectId, CSharpSymbolsReference)
.AddMetadataReference(projectId, CodeAnalysisReference)
.AddMetadataReference(projectId, KanColleViewerCompositionReference)
.AddMetadataReference(projectId, SystemComponentModelCompositionReference)
;
int count = 0;
foreach (var source in sources)
{
var newFileName = fileNamePrefix + count + “.” + fileExt;
var documentId = DocumentId.CreateNewId(projectId, debugName: newFileName);
solution = solution.AddDocument(documentId, newFileName, SourceText.From(source));
count++;
}
return solution.GetProject(projectId);
}
//以下略
[/csharp]
これでアセンブリが参照されるようになり、テストが通るようになります。
これは RC 版でのテンプレートの問題なので、もしかしたら将来変更されるかもしれませんね。