【问题标题】:Parallel namespacing conflict并行命名空间冲突
【发布时间】:2014-06-02 15:45:10
【问题描述】:

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

MyModule.MyNamespace.MySubNamespace.MyClass

将在此类中定义:

Test.MyModule.MyNamespace.MySubNamespace.MyClass

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

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

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

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

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

【问题讨论】:

    标签: c# unit-testing namespaces


    【解决方案1】:

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

    global::MyModule.MyNamespace.MySubNamespace.MyClass
    

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

    【讨论】:

      【解决方案2】:

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

      using implementation = MyModule.MyNamespace.MySubNamespace;
      

      然后在测试中

      implementation::MyClass myClass = new...
      

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

      【讨论】:

        【解决方案3】:

        我通常有这样的东西:

        MyCompany.MyProduct.MyModuleTests.MyNamespace.MySubNamespace.MyClassTest
        

        这通常会让人们很清楚,并且与 TFS 构建配合得很好,它会尝试检测名称中带有“Test”的所有程序集中的单元测试。

        如果你真的很喜欢你的命名约定,你可以在测试文件的顶部为命名空间使用别名:

        using MyRealStuff = MyModule.MyNamespace.MySubNamespace;
        

        并在代码中使用:

        MyRealStuff.MyClass myobject = new ...
        

        【讨论】:

          猜你喜欢
          • 2010-09-20
          • 1970-01-01
          • 2013-01-26
          • 2010-11-15
          • 2012-12-18
          • 2012-02-06
          • 1970-01-01
          相关资源
          最近更新 更多