【问题标题】:Test that Project Reference doesn't exist测试项目参考不存在
【发布时间】:2017-04-25 19:17:21
【问题描述】:

我有一个包含多个项目的 Visual Studio 解决方案。大多数项目供内部/Intranet 使用,但少数是面向公众的网站。

对于内部项目,我使用带有实体框架的ProjectName.Data 项目来访问数据库。

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

作为我的集成/系统测试的一部分,我想确保这些公共项目引用ProjectName.Data 项目(例如,确保某些开发人员没有说嘿,我们开始吧,我会在这里添加一个参考,然后繁荣,轻松访问整条船)。

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

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

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

【问题讨论】:

    标签: c# reflection mstest


    【解决方案1】:

    您可以使用 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);
    

    【讨论】:

      【解决方案2】:

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

      1) 你可以create a custom Visual Studio extension防止这种被禁止的引用首先被添加(无论如何,通过用户界面)。

      2) 您可以在 pre-commit 挂钩 中检查此类引用(脚本检查 .csproj 文件中的 XML),这样即使添加了它们,它们 也不会进入源代码控制。以下是GitSVN 的可能起点。

      3) 您可以在代码和拉取请求审查中检查它们——这是一种“过程”解决方案,而不是技术解决方案。这样,引用可能会被检入开发分支,但它们永远不会进入发布分支

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

      5) 您可以稍后在测试执行时捕获它们,这正是您想要做的。我不会说在这个阶段检查这些错误是不好的,自然尽早发现它们会更好,特别是如果数据暴露的风险/成本很高。

      我对 Visual Studio 对象模型了解不多,但这里有一些 SO 问题(#1#2#3#4)和 MSDN article 可能对此有所帮助接近。

      【讨论】:

      • 感谢您的想法。我们按原样进行拉取请求和审查,但认为如果我能在其他地方阻止它,那就少了一件事情。我通常会尽量避免使用自定义 VS 扩展,但通过 MSBuild 处理似乎非常理想 - 我应该在那里设置一些东西。
      猜你喜欢
      • 2022-06-13
      • 2017-01-19
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多