单元测试和PostSharp

14

我想知道最好的做法是什么... 我有兴趣在我的项目中引入PostSharp,但我不确定如何正确地为标记了属性的类编写单元测试。

例如:

public class hello {

    [MyAspectThatDoesSomethingToTheDatabaseWhenThisMethodGetsCalled]
    public int omg(string lol) {
        //fancy logic in here
    }
}
我想测试omg()方法中的逻辑,但在单元测试中,我需要确保不会调用该方面,因为实际上并没有数据库。你有什么想法吗?

您有何想法?

7个回答

3

3
我不确定PostSharp的工作方式,但据我目前的理解,您需要在后期构建过程中调用一个过程将方面编织到IL中。
如果我的理解是正确的,并且如果您可以跳过后期构建编织,则应该在忽略方面的情况下测试方法(并在其他地方单独测试方面)。
为什么?
如果您同时测试方面和方法,则会同时测试3个方面:
1.方法 2.方面 3.将方面编织到代码中
这是不好的做法,如果出现问题可能会让您陷入困境(以及使您的单元测试成为集成测试)。
查看上面的列表:
1. 您确实需要隔离地测试方法,没有其他干扰,这将让您专注于确保方法恰好按预期执行-不多也不少。 2. 您不需要每次使用时都测试方面,只需测试一次并确保它按您的想法执行即可。 3. 您不需要测试编织是否有效; 它(应该)作为PostSharp实现的一部分进行测试。

最好编写单元测试,但集成测试也不错,特别是如果从方面隔离方法太困难。 - Michael Freidgeim

2
如果您想编写纯粹的单元测试,请在单元测试构建期间通过在项目中设置编译符号“SkipPostSharp”或设置MSBuild属性“SkipPostSharp=True”来禁用模块的PostSharp。
如果您愿意进行集成测试,可以测试您的方法和PostSharp属性的完整功能,包括DB访问(由Gael建议)。

1

我不同意Gael的观点。 我从朋友那里学到,我必须测试我要编写的代码,通常只需要测试一次。


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

0

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


0

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

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

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

我还尝试在Visual Studio中使用配置管理器创建另一个构建定义,但我的所有尝试都只产生了更多的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接