单元测试时如何正确模拟 HostingEnvironment?

How do I mock HostingEnvironment properly when unit testing?

提问人:Zik 提问时间:11/7/2023 最后编辑:Peter CsalaZik 更新时间:11/9/2023 访问量:49

问:

我正在尝试测试一个代码块,上面写着。

if (!HostingEnvironment.IsHosted) 
{
    throw new Exception();
} 
else 
{
    doWork();
}

我一直在尝试创建一个这样的新实例

var hostEnv = new HostingEnvironment();

当每个测试单独运行时,它都会起作用,但有时会在消息中引发异常

“AppDomain 中只能有一个 HostingEnvironment。”

C# 最小起订量

评论

4赞 Dai 11/7/2023
WebForms 不能像这样测试——这是 WebForms 现在死了的原因之一。取而代之的是,将您的业务/领域逻辑重构为一个新的类库,不依赖于并定义您自己的隐藏 、 等接口 - 然后您可以对其进行测试。System.Web.dllHttpContextHttpRequest
0赞 Panagiotis Kanavos 11/7/2023
如果使用 ASP.NET Core,则是在 DI 容器中注册的接口。这意味着只需使用虚拟实现即可轻松模拟它。您可以在主机配置中或使用 WebApplicationFactory 进行集成测试时指定环境app.EnvironmentUseEnvironment
0赞 Mark Seemann 11/8/2023
这是HostingEnvironment.IsHosted吗?如果是这样,它是非虚拟的,所以不能被 Test Double 取代(即不能被“嘲笑”)。static
0赞 cscmh99 11/8/2023
如果你真的想模拟这个检查,你可以简单地通过创建一个实例来包装逻辑,例如 HostingEnvInfoProvider 和 isHosted 函数。
0赞 Dai 11/8/2023
@MarkSeemann 除非你想舒适Detours

答: 暂无答案