问题描述
我想测试我编写的一些反射代码。
如果 ReferencedAssemblies 尚未加载到 AppDomain 中,即如果以下表达式曾经返回 true
,则会发生边缘情况:
typeof(MyType).Assembly.GetReferencedAssemblies()
.Except(AppDomain.CurrentDomain.GetAssemblies().Select(assem => assem.GetName()))
.Any()
我有两个问题:
- 这能返回
true
吗? (我认为“是”[因此标题问题的答案是“否”],尽管我不确定)。 - 假设它可以……那么为了单元测试的目的,我该如何编排它?
解决方法
正如我所怀疑的,它不是一个子集。
您可能会遇到 ReferencedAssembly
当前尚未加载到 AppDomain.CurrentDomain
中的情况。
要在测试中实现这一点:
- 创建辅助
csproj
。 (ProjTwo
) - 在您的测试项目和
csproj
之间创建ProjTwo
级依赖项。 - 添加一个未使用的类,该类引用了
ProjTwo
中的某些代码。- 如有必要,向
ProjTwo
添加一个带有静态无操作方法的静态类,并添加第二个静态类,该类仅在您的测试项目中调用该方法。
- 如有必要,向
- 不要在 TestFixtures 的任何地方引用
ProjTwo
程序集。
瞧!
第 4 步似乎意味着 ProjTwo
不会被加载,而第 3 步确保编译器无法删除引用,因此它仍然出现在 GetReferencedAssemblies()
中,躲避 {{3 }}。