并行命名空间冲突

本文关键字:冲突 命名空间 并行 | 更新日期: 2023-09-27 18:06:11

我有一个单元测试项目,它反映了我的应用程序的目录和名称空间结构,除了单元测试项目将所有内容包装在Test名称空间中。所以这个类的测试:

MyModule.MyNamespace.MySubNamespace.MyClass

将在这个类中定义:

Test.MyModule.MyNamespace.MySubNamespace.MyClass

当我尝试创建在常规(非单元测试)项目中定义的对象的实例时,如果在单元测试项目中也存在同名的类,我在单元测试项目中遇到问题。使用上面的示例,如果我在单元测试项目中使用完全限定类型名称创建类型为MyClass的变量:

MyModule.MyNamespace.MySubNamespace.MyClass myobject = new ....

编译器假定我引用的是Test名称空间中定义的MyClass对象,并且不将类型名称视为完全限定名称。

简单的解决方案是重构我的单元测试名称空间,但我很好奇是否有办法解决这个问题。我需要某种方法来"强制"编译器将类型名称视为完全限定的—一种"跳出"Test名称空间的方法。有什么办法可以做到吗?

如果没有,是否有一个更好的约定来清楚地命名我的单元测试?

并行命名空间冲突

在进一步搜索之后,我遇到了global关键字,它告诉编译器假设类型名称是完全限定的:

global::MyModule.MyNamespace.MySubNamespace.MyClass

以下是MSDN上global关键字的参考

尝试使用名称空间的别名。如

using implementation = MyModule.MyNamespace.MySubNamespace;

然后在测试

implementation::MyClass myClass = new...

这里是关于它的文档http://msdn.microsoft.com/en-gb/library/c3ay4x3d.aspx

我通常有这样的东西:

MyCompany.MyProduct.MyModuleTests.MyNamespace.MySubNamespace.MyClassTest

这通常对人们来说很清楚,也可以很好地用于TFS构建,它将尝试在所有名称中带有"Test"的程序集中检测单元测试。

如果您真的坚持您的命名约定,您可以在测试文件的顶部为名称空间使用别名:

using MyRealStuff = MyModule.MyNamespace.MySubNamespace;

在代码中使用:

MyRealStuff.MyClass myobject = new ...