我有一个单元测试项目,它反映了我的应用程序的目录和命名空间结构,除了单元测试项目将所有内容包装在Test
命名空间中。所以这个类的测试:
MyModule.MyNamespace.MySubNamespace.MyClass
将在此课程中定义:
Test.MyModule.MyNamespace.MySubNamespace.MyClass
当我尝试创建常规(非单元测试)项目中定义的对象实例时,如果单元测试项目中也存在同名的类,那么我在单元测试项目中遇到了问题。使用上面的示例,如果我使用其完全限定的类型名称在单元测试项目中创建类型为MyClass
的变量:
MyModule.MyNamespace.MySubNamespace.MyClass myobject = new ....
编译器假定我指的是MyClass
命名空间中定义的Test
对象,并且不将类型名称视为完全限定名称。
简单的解决方案是重构我的单元测试命名空间,但我很好奇是否有办法解决这个问题。我需要一些方法来“强制”编译器将类型名称视为完全限定 - 这是一种“突破”Test
命名空间的方法。有没有办法做到这一点?
如果没有,是否有更好的约定来明确命名我的单元测试?
答案 0 :(得分:5)
经过一些搜索后,我遇到了global
关键字,它告诉编译器假设类型名称是完全限定的:
global::MyModule.MyNamespace.MySubNamespace.MyClass
答案 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 ...