gpt4 book ai didi

c# - 在 ASP.NET 单元测试中模拟 HttpContext.server.MapPath

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

我在 ASP.Net web 应用程序中进行单元测试,现在我可以访问模型文件中的构造函数来测试哪个具有用于上传我的 XML 文件的 Server.MapPath 代码,当尝试测试它时我得到错误,因为HttpContext 为空,所以我必须模拟 Server.MapPath。

我搜索了很多,但每个示例都只针对 Asp.NET MVC,但我在 ASP.NET 中工作。所以请在 ASP.NET 中帮助解决这个问题。

我的代码如下。

public class NugetPlatformModel
{
public bool IsHavingLicense { get; set; }
public List<PlatformProducts> PlatformProduct = new List<PlatformProducts>();
public NugetPlatformModel()
{
var xmldoc = new XmlDocument();

mldoc.Load(HttpContext.Current.Server.MapPath(@"~\Content\PlatformProducts.xml"));
}
}

还有我的单元测试代码

 [Test]
public void Account_UnlicensedCustomerIdentity_IsStudioLicenseAndIshavinglicenseFalse()
{

//Act
NugetPlatformModel nugetPlatformModel = new NugetPlatformModel();

//Assert
AssertEquals(false, nugetPlatformModel.IsHavingLicense);

}

最佳答案

这是调用静态方法的典型代码,在保持关注点分离和避免紧耦合的同时进行测试非常困难。这是测试和模拟“不可测试代码”的通用方法:为其编写一个“外观包装器”。

  • 为这些方法创建一个包装器。一个简单的类,包含合理命名的方法,并且只委托(delegate)给不可测试的调用(通常是静态调用)

  • 为该包装类创建一个接口(interface)

  • 不要直接调用客户端代码中不可测试的方法,而是使用包装器(使用步骤 2 中提供的接口(interface)进行依赖注入(inject))并在其上调用普通方法。

  • 在您的单元测试中,用您想要的行为模拟包装器。

这种方式有效的降低了耦合度,分离了需要分离的关注点。当然,您仍然无法测试包装器本身的行为,但如果它足够简单(仅委托(delegate)给原始调用)那么问题就不是那么大。

更新:

Using shims to isolate your application from other assemblies for unit testing

Shim 类型是 Microsoft Fakes Framework 使用的两种技术之一,可让您轻松地将测试中的组件与环境隔离开来。 Shims 将对特定方法的调用转移到您编写的代码中作为测试的一部分。许多方法根据外部条件返回不同的结果,但 shim 受您的测试控制,并且可以在每次调用时返回一致的结果。这使您的测试更容易编写。使用垫片将您的代码与不属于您的解决方案的程序集隔离开来。要将解决方案的组件彼此隔离,我们建议您使用 stub 。

关于c# - 在 ASP.NET 单元测试中模拟 HttpContext.server.MapPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28942015/

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