并行命名空间冲突

时间:2014-06-02 15:45:11

标签: c# unit-testing namespaces

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

MyModule.MyNamespace.MySubNamespace.MyClass

将在此课程中定义:

Test.MyModule.MyNamespace.MySubNamespace.MyClass

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

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

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

简单的解决方案是重构我的单元测试命名空间,但我很好奇是否有办法解决这个问题。我需要一些方法来“强制”编译器将类型名称视为完全限定 - 这是一种“突破”Test命名空间的方法。有没有办法做到这一点?

如果没有,是否有更好的约定来明确命名我的单元测试?

3 个答案:

答案 0 :(得分:5)

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

global::MyModule.MyNamespace.MySubNamespace.MyClass

Here's the reference for the global keyword on MSDN.

答案 1 :(得分:1)

尝试使用命名空间的别名。 例如

using implementation = MyModule.MyNamespace.MySubNamespace;

然后在测试中

implementation::MyClass myClass = new...

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

答案 2 :(得分:0)

我通常会看到这样的东西:

MyCompany.MyProduct.MyModuleTests.MyNamespace.MySubNamespace.MyClassTest

这通常使人们非常清楚,并且还可以很好地使用TFS构建,这些构建将尝试在名称中使用“Test”检测所有程序集中的单元测试。

如果您真的依赖于命名约定,则可以在测试文件的顶部使用命名空间的别名:

using MyRealStuff = MyModule.MyNamespace.MySubNamespace;

并在代码中使用:

MyRealStuff.MyClass myobject = new ...