单元测试和PostSharp

时间:2010-02-10 20:13:11

标签: unit-testing nunit aop postsharp

我想知道最好的方法是什么...我有兴趣将PostSharp引入我的一个项目中,但我不确定如何正确地测试标记有属性的类。

例如:

public class hello {

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

我想测试omg()方法中的逻辑,但是在单元测试中我需要确保不会调用方面,因为实际上没有数据库。

思想?

7 个答案:

答案 0 :(得分:3)

我的意见是你应该测试代码,好像方面是手动编码的 - 即测试方法的全部功能,包括方面实现的功能。

现在在http://doc.postsharp.net/postsharp-3.0/Content.aspx/PostSharp-3.0.chm/html/2ad6cf92-08eb-4537-a434-d88a3e493721.htm

的PostSharp在线文档中记录了这个问题

答案 1 :(得分:3)

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

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

为什么?

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

  1. 方法
  2. 方面
  3. 将方面编织成代码
  4. 这是不好的业力,如果出现问题(以及让你的单元测试进入集成测试),可能会导致你陷入兔子洞。

    查看上面的列表:

    • 需要 测试方法 ,孤立无任何其他干扰,因为这会让你专注于确保方法完全符合您的预期 - 不多也不少。
    • 需要每次 测试方面 ,只需测试一次并确保它做你认为它做的事
    • 需要 测试编织工作 ;它应该(应该)作为后期实施的一部分进行测试。

答案 2 :(得分:2)

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

如果您乐意进行集成测试,则可以测试方法和PostSharp属性的完整功能,包括数据库访问(如suggested by Gael)。

答案 3 :(得分:1)

我不同意盖尔。 我从朋友那里得知,我必须测试我要编写的代码,一般只测试一次。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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

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

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