NetArchTest分层架构测试异常:依赖检测结果始终返回False
排查NetArchTest依赖检测始终返回False的问题
针对你遇到的NetArchTest.Rules无论使用ShouldNot还是Should都返回False的问题,给出以下具体排查步骤:
确认目标程序集已正确加载
Types.InCurrentDomain()依赖当前AppDomain加载的程序集,如果测试项目未直接引用Flux.Access.Assets或其他Access项目,或者这些项目的输出dll未被复制到测试项目的运行目录,就会导致没有匹配到任何类型,测试自然返回False。建议替换为明确指定程序集的方式:Types.FromAssembly(typeof(Flux.Access.Assets.某个类).Assembly)确保能精准定位到目标程序集。
检查隐式间接依赖
即使没有项目级引用,也可能存在隐式依赖:- 检查
Flux.Access.Common是否引用了其他Access项目(Blob/Configurations/Members),如果Common依赖这些项目,Assets通过引用Common会间接产生依赖链; - 查看Assets项目的输出目录(bin/debug/release),确认是否存在其他Access项目的dll,可能是通过其他依赖项被复制过来的;
- 排查是否有通过反射、动态加载等方式引用了其他Access项目的类型。
- 检查
验证命名空间匹配规则
ResideInNamespace默认是精确匹配命名空间,如果Assets项目中有类型位于子命名空间(比如Flux.Access.Assets.Utils),这些类型不会被检测到。可以添加第二个参数开启包含子命名空间的匹配:.ResideInNamespace(AssetsNamespace, true)同时确认所有需要检测的类型确实属于
Flux.Access.Assets命名空间。查看测试失败的具体详情
不要只依赖IsSuccessful结果,获取失败信息能直接定位问题:var testResult = Types .InCurrentDomain() .That() .ResideInNamespace(AssetsNamespace) .ShouldNot() .HaveDependencyOnAny(otherProjects) .GetResult(); // 打印所有失败项 foreach (var failure in testResult.Failures) { Console.WriteLine(failure); } Assert.True(testResult.IsSuccessful);失败信息会告诉你是哪些类型违反了规则,或者根本没有匹配到任何类型,这是排查的关键。
清理并重新构建解决方案
旧的dll缓存可能导致检测错误:- 清理解决方案(右键解决方案 -> 清理);
- 删除所有项目的bin和obj目录;
- 重新构建整个解决方案,确保所有输出都是最新的。
检查NetArchTest版本兼容性
部分版本可能存在bug,尝试升级NetArchTest.Rules到最新稳定版,或者回退到已知稳定的版本,验证问题是否消失。
内容的提问来源于stack exchange,提问作者Martin Kent
相关产品推荐
相关产品推荐

