3

我的情况

我在 ASP.NET MVC4 应用程序中进行测试。我正在开发的应用程序部分将现代 WebSecurity/SimpleMembershipProvider 与正在逐步淘汰的遗留身份验证系统相结合。我很乐意对此进行适当的单元测试,但出于实际原因,我选择不模拟或排除 WebSecurity;我只是将它指向一个测试数据库。*

问题:

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

我想隔离我的测试,擦除数据库并InitializeDatabaseConnection在每次测试之前调用(即在[Setup]方法中)。但是,WebSecurity 静态维护其 Initialized 状态,这意味着如果它在同一个应用程序实例中运行多次,则会引发异常。

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

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

问题:

有什么方法可以“取消初始化”WebSecurity,以便我可以在单个应用程序实例中多次初始化它?或者,有没有办法表明 NUnit 应该在某个夹具中的每次测试之前重新启动应用程序?

笔记:

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


* 毕竟我决定模拟 WebSecurity;请参阅下面的我的自我回答。

4

1 回答 1

2

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

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

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

于 2013-01-18T20:19:04.767 回答