gpt4 book ai didi

c# - 单元测试时我怎么能 "uninitialize"WebSecurity?

转载 作者:行者123 更新时间:2023-11-30 17:07:41 25 4
gpt4 key购买 nike

我的情况

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

问题:

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

我想隔离我的测试,删除数据库并在每次测试之前调用 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;请参阅下面我的 self 回答。

最佳答案

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

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

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

关于c# - 单元测试时我怎么能 "uninitialize"WebSecurity?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14346393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com