[英]Test that Project Reference doesn't exist
我有一个包含多个项目的Visual Studio解决方案。 大多数项目供内部/内部网使用,但一小部分是面向公众的网站。
对于内部项目,我使用带有访问数据库的Entity Framework的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")
来解决这个问题,但是我更愿意检查引用本身。
您可以为此使用罗斯林。 首先安装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)您可以创建一个自定义的Visual Studio扩展 ,以防止 首先 (无论如何通过UI) 添加此类禁止的引用。
2)您可以在预提交挂钩中检查此类引用(脚本检查.csproj文件中的XML),以便即使添加了它们,也永远不会将其放入源代码管理中 。 这是Git和SVN的可能起点。
3)您可以在代码和请求请求复查中检查它们-这是“过程”解决方案,而不是技术解决方案。 这样,引用可以被检入到开发分支中,但是它们永远不会进入发布分支 。
4)您可以在构建时使用自定义MSBuild任务 / target捕获它们 。 这样做的好处是可以说是在理想的抽象级别上进行操作-MSBuild是读取,解析和用于编译项目引用的地方。
5)您可以稍后在测试执行时捕获它们 ,这是您要尝试执行的操作。 我不会说在现阶段检查这些错误很不好, 但是自然地,尽早发现它们会更好 ,尤其是在数据公开的风险/成本很高的情况下。
我对Visual Studio对象模型了解不多,但是这里有一些SO问题( #1 , #2 , #3和#4 )以及MSDN文章可能对这种方法有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.