测试项目引用不存在

Test that Project Reference doesn't exist

我有一个包含多个项目的 Visual Studio 解决方案。大多数项目供 internal/intranet 使用,但有一小部分供 public 面向网站使用。

对于内部项目,我使用 ProjectName.Data 项目和 Entity Framework 访问数据库。

对于 public 项目,我使用了不同的数据访问方法,该方法只允许访问特定模式中的存储过程。

作为我的 integration/system 测试的一部分,我想确保这些 public 项目 没有 引用 ProjectName.Data项目(例如,确保某些开发人员没有说 嘿,我们开始吧,我将在此处添加参考,然后繁荣,轻松访问整艘船)。

作为这个 public 面的 MSTest 项目的一部分,我希望能够做这样的事情:

[TestMethod]
[TestCategory("Integration")]
public void CheckNoAccessToDataProject() {
    var ref = ProjectUnderTest.GetReference("ProjectName.Data");
    Assert.IsNull(ref);
}

我确实找到了一种方法,可以通过使用 Type.GetType("Full.Name.To.EF6.Context") 来解决这个问题,但我更愿意检查参考资料本身。

您可以为此使用 Roslyn。首先安装 nuget 包 Microsoft.CodeAnalysis.Workspaces.Common,然后:

var solutionPath = @"path to your solution .sln file";
var msWorkspace = MSBuildWorkspace.Create();
var solution = msWorkspace.OpenSolutionAsync(solutionPath).Result;
var dataProject = solution.Projects.First(c => c.Name == "ProjectName.Data");
var testProject = solution.Projects.First(c => c.Name == "NameOfProjectYouTest");
var hasReference = testProject.AllProjectReferences.Any(c => c.ProjectId == dataProject.Id);

为了解决您所描述的问题,您可能需要考虑一种或组合其他可能更好(并且可能更容易实施)的方法:

1) 您可以create a custom Visual Studio extension 阻止 此类被禁止的引用 首先被添加 (通过 UI, 无论如何).

2) 您可以在 预提交挂钩 中检查此类引用(脚本检查 XML in .csproj 文件),这样即使添加了它们,它们永远不要将其纳入源代码管理。以下是 Git and SVN.

的可能起点

3) 您可以在 代码和拉取请求评论 中查看它们——这是一个 "process" 解决方案,而不是技术解决方案。这样,引用可能会被签入开发分支,但它们 永远不会进入发布分支

4) 您可以 在构建时使用 custom MSBuild task/target 捕获它们。这里的优势在于,您可以说是在理想的抽象级别上操作——MSBuild 是读取、解析项目引用并用于编译的地方。

5) 您可以 稍后在测试执行时捕获它们,这正是您想要做的。我不会说在这个阶段检查这些错误是不好的,但是当然早点发现它们会更好,尤其是如果risk/cost 的数据曝光度很高。

我对 Visual Studio 对象模型知之甚少,但这里有一些 SO 问题(#1, #2, #3, and #4) and an MSDN article 可能对这种方法有所帮助。