如何“取消初始化”?单元测试时的WebSecurity

本文关键字:单元测试 WebSecurity 取消 初始化 取消初始化 如何 | 更新日期: 2023-09-27 17:53:37

我的情况

我把测试放在ASP中。NET MVC4应用程序。我正在开发的应用程序的一部分结合了现代WebSecurity/SimpleMembershipProvider和一个正在逐步淘汰的遗留身份验证系统。

我很想对此做适当的单元测试,但出于实际原因,我选择不模拟或存根WebSecurity;我只是把它指向一个测试数据库。*

问题:

使用NUnit,我想使用WebSecurity.InitializeDatabaseConnection()方法为一系列测试设置WebSecurity。这个方法被设计为只运行一次,最好是在应用程序启动时。

我想隔离我的测试,擦除数据库并在每次测试之前调用InitializeDatabaseConnection(即在[Setup]方法中)。然而,WebSecurity静态地维护它的Initialized状态,这意味着如果它在同一个应用实例中运行了不止一次,它就会抛出异常。

换句话说,只有我的第一个测试有效;后面的会抛出异常:

System.InvalidOperationException : The "WebSecurity.InitializeDatabaseConnection" method can be called only once.

问题:

是否有任何方法我可以"取消初始化"WebSecurity,以便我可以在单个应用程序实例中多次初始化它?或者,是否有一种方法可以指示NUnit应该在某个固定装置的每次测试之前重新启动应用程序?

指出:

我试过在[TestFixtureSetup]方法或[SetUpFixture]中调用WebSecurity.InitializeDatabaseConnection()一次,只是在测试之间擦去相关表,但我真的更喜欢有一个保证的干净状态。此外,这种方法有一个不幸的副作用:如果我想使用NUnit GUI按顺序运行一些测试,然后按顺序运行更多的测试,我必须在序列之间重新加载程序集。GUI在每个测试序列运行一次这些设置方法,但显然维护相同的应用程序实例,直到程序集被重新加载。


*我最终决定嘲笑WebSecurity;

如何“取消初始化”?单元测试时的WebSecurity

我说我选择不模拟或存根WebSecurity,但这是这个问题的一个可能的解决方案。比起正确调用WebSecurity的静态方法,我可以创建一个名为WebSecurityWrapper的类,并使用调用WebSecurity方法的实例方法。

我的单元测试可以传入一个模拟WebSecurityWrapper(用moq制作),它的行为如我所愿。尝试模拟静态类没有问题(因为WebSecurityWrapper是非静态的)。无需为simplememmembership设置数据库。

在遇到与FormsAuthentication cookie相关的其他问题并且没有更好的答案之后,我选择使用这种模拟方法继续前进。