2010-02-10 59 views
14

我想知道什么是最好的方法来做到这一点......我有兴趣将PostSharp引入到我的项目之一,但我不知道如何单元测试标记有属性的类正常。单元测试和PostSharp

例如:

public class hello { 

    [MyAspectThatDoesSomethingToTheDatabaseWhenThisMethodGetsCalled] 
    public int omg(string lol) { 
     //fancy logic in here 
    } 
} 

我想测试在OMG()方法中的逻辑,但在单元测试,我需要确保该方面不会被调用,因为有并不是一个真正的数据库。

想法?

回答

0

可能您可以使用依赖注入并为您决定使用哪种数据库访问提供程序(例如使用工厂)的方面类引入一个静态属性,并在测试范围内设置假类。

1

我不同意盖尔记录在PostSharp在线文档。 我从一位朋友那里了解到,我必须测试我要写的代码,而且一般只有一次。

3

我不完全确定postsharp是如何工作的,但正如我目前所了解的那样,您会调用一个后期构建过程来将这些方面编织到IL中。

如果我的理解是正确的,并且如果您可以跳过构建后编织,那么您应该在无视该方面的情况下测试您的方法(并在其他地方单独测试该方面)。

为什么?

如果测试方面和方法,则在一次测试3两件事:

  1. 方法
  2. 纵横
  3. 方面的编织到代码

这是不良的业力,如果出现问题,可能会导致你落入兔子洞(以及使你的单元测试成为集成测试)。

看着上面的列表:

  • 需要测试方法,孤立,没有其他干扰,因为这将让你专注于确保该方法不正是你期望的 - 不多也不少。
  • 需要每一个它使用的时间测试方面,只是测试了一次,并确保它做什么,你认为它
  • 需要测试编织工程;它应该(应该)作为急剧实施后的一部分进行测试。
+0

编写单元测试更好,但集成测试也不错,特别是如果从方面隔离方法太难了。 – 2013-04-27 12:19:57

1

为了关闭我的代码与数据库方面,我引入了一个名为TestingEnvironment与布尔属性称为TurnOffAspects静态类。方面中的代码检查此属性,如果它设置为“true”,则该方面将不做任何事情而返回。 在测试设置期间,我将TestingEnvironment.TurnOffAspects属性设置为true,并且在测试拆卸期间返回false。 当然,你可以使事物更加细化,在每个方面引入一个属性。您应该非常仔细地选择您关闭的哪些方面,因为它可以对测试产生很大的影响,并且即使在测试通过时也会使您的生产代码失败。

2

如果要编写纯单元测试,请考虑在UNIT TESTING构建期间通过在项目中设置编译符号'SkipPostSharp'或设置MSBuild属性'SkipPostSharp = True'来禁用该模块的PostSharp。

如果你很高兴做整合测试,可以测试你的方法和属性PostSharp全部功能,包括数据库访问(如suggested by Gael)。

0

我目前的做法是让测试作为我们TFS构建过程的一部分运行。这可能对所有情况都没有帮助,但我花了很长时间才找到一个解决方案,可以让我在不受PostSharp影响的情况下运行业务逻辑的单元测试。

我创建了两个不同的构建定义,其中之一的MSBuild参数设置为/p:SkipPostSharp=True(这是运行单元测试的一个),另一个分别是False。另外,我使用PostSharp将构建定义的Disable Tests选项设置为True

我知道这并不理想(特别是因为现在我已经遇到了无法在没有任何更改的情况下在本地运行测试的问题),但我找不到任何其他方式。似乎没有太多的人有同样的问题。由于我是MSBuild及其配置方面的绝对新手,也许有更好知识的人可以提供帮助。

我也在Visual Studio中使用Configuration Manager来创建另一个构建定义,但是我所有的尝试都只会产生比其他任何问题更多的问题。