测试项目引用不存在
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 可能对这种方法有所帮助。
我有一个包含多个项目的 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 可能对这种方法有所帮助。