c# - Roslyn 语义分析:为什么从单元测试调用时会有所不同?
问题描述
考虑下面的代码。
我的解决方案.sln
using System;
using System.Linq;
using Microsoft.Build.Locator;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.MSBuild;
public class MyApp
{
public static void Main(string[] args)
{
MSBuildLocator.RegisterDefaults();
var workspace = MSBuildWorkspace.Create();
var solution = workspace
.OpenSolutionAsync(@"/<PATH>/SolutionToAnalyse.sln")
.Result;
var project = solution.Projects.First();
var compilation = project.GetCompilationAsync().Result;
var documents = project.Documents.ToList();
var document = documents.First(d => d.Name.Equals("Foo.cs"));
var syntaxTree = document.GetSyntaxTreeAsync().Result;
var root = syntaxTree!.GetRoot();
var semanticModel = compilation!.GetSemanticModel(syntaxTree);
// fetch myList.Any()
var inVocExSyn = root.DescendantNodes().OfType<InvocationExpressionSyntax>().ToList()[0];
var iSym = semanticModel.GetSymbolInfo(inVocExSyn).Symbol;
// prints System.Collections.Generic.IEnumerable<int>.Any<int>()
Console.WriteLine(iSym);
}
}
SolutionToAnalyse.sln - 包含一个项目和一个文件 Foo.cs:
public class Foo
{
public void FooMethod()
{
List<int> myList = new List<int>();
if (myList.Any())
{
Console.WriteLine("List is not empty");
}
}
}
运行程序,例如,通过使用dotnet run
,它会打印System.Collections.Generic.IEnumerable<int>.Any<int>()
,这是预期的行为。
但是,如果程序是从测试环境中执行的,例如 xUnit:
public class UnitTest
{
[Fact]
public void Test1()
{
MyApp.Main(new[] {""});
}
}
它打印一个空行,因为它iSym
是空的。这是为什么?
解决方案
推荐阅读
- azure-logic-apps - 事件网格 - 逻辑应用程序 - 无法检索值
- asp.net - 使用 .net 和 vb,我如何处理会话和动态变量?
- linear-algebra - 并行求解多个小型线性系统
- database - 侦听数据库更新的工具
- xml - 动态 XSLT - 从网页而不是命令行运行转换
- c# - 单击时文本框的 Visual Studio 2015 C# 颜色对话框
- c# - 在 Mac 上运行的 .NET Core 上出现 X509Chain 错误
- django - 使用 MPTT 在 Post 之后将多个 ModelMutipleChoiceField 的值复制为一个
- java - 返回布尔值的 Java 10 ifPresentOrElse
- android - AOSP 构建错误忍者失败:退出状态 1