【问题标题】:Unit Testing and PostSharp单元测试和 PostSharp
【发布时间】:2011-01-15 10:48:04
【问题描述】:

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

例如:

public class hello {

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

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

想法?

【问题讨论】:

    标签: unit-testing nunit aop postsharp


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我的意见是,您应该像手动编写切面一样测试代码——即测试方法的全部功能,包括切面实现的功能。

      这个问题现在记录在 PostSharp 在线文档中,地址为 http://doc.postsharp.net/postsharp-3.0/Content.aspx/PostSharp-3.0.chm/html/2ad6cf92-08eb-4537-a434-d88a3e493721.htm

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            我不完全确定 postsharp 是如何工作的,但据我目前了解,您调用后期构建过程将方面编织到 IL 中。

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

            为什么?

            如果你测试方面和方法,你同时测试 3 件事:

            1. 方法
            2. 方面
            3. 将方面编织到代码中

            这是不好的因果报应,如果出现问题(以及使您的单元测试成为集成测试),可能会导致您陷入困境。

            查看上面的列表:

            • 确实需要测试该方法,在没有其他干扰的情况下单独进行,因为这会让您专注于确保该方法完全符合您的预期 - 不多也不少。
            • 不需要每次使用的时候都测试方面,只测试一次并确保它按照您的想法行事
            • 不需要测试编织是否有效;它(应该)作为后期实施的一部分进行测试。

            【讨论】:

            • 最好写单元测试,但集成测试也不错,特别是如果从方面隔离方法太难了。
            【解决方案6】:

            我不同意盖尔的观点。 我从一个朋友那里得知,我必须测试我要编写的代码,而且通常只测试一次。

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-04-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-08-23
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多