gpt4 book ai didi

c# - 我可以模拟一个私有(private)方法或者测试这个 POST 方法的正确方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 20:03:59 25 4
gpt4 key购买 nike

我有一个现有的 ASP.NET MVC 应用程序,想创建一些单元测试,但我很快遇到了以下问题。有没有某种方法可以使用最小起订量并说“当运行私有(private)方法 GETCLIENTIP 时,然后返回‘xxx’”)?

因为现在它使用了单元测试当然没有的 HttpContext 部分。

public HttpResponseMessage Post([FromBody]TriageCase TriageCase)
{
if (ModelState.IsValid)
{
//Get the IP address from the request
TriageCase.ipAddress = this.GetClientIP(Request);

_log.Info("IP Address = " + TriageCase.ipAddress);
}
}

public void Verify_Not_A_Suicide()
{
TriageCaseRepository repository = new TriageCaseRepository();
var controller = new TriageCasesController(repository);
//This will not work because I must mock a private method in the controller?
HttpResponseMessage result = controller.Post(new TriageCase());
}

最佳答案

有几种方法可以做到这一点,从令人讨厌的复杂方法到简单的权衡方法。这里有一些:

  • 您可以使 GetClientIP 方法与 HttpContext 无关。然后把它变成内部的。用 InternalsVisibleTo 标记 Controller 程序集并放置单元测试程序集路径。

使方法与 HttpContext 无关,可以让您免于拥有 HttpContextBase(从 3.5 开始用于启用测试的抽象 http 上下文类)并提供模拟等(顺便说一句,你应该考虑一下。尤其是对于 MVC)将特定的字符串作为参数传递给方法。例如具体的服务器变量字符串。

  • 您可以使 GetClientIP 方法接收 HttpContextBase 作为参数,然后将其设为内部。用 InternalsVisibleTo 标记 Controller 程序集并放置单元测试程序集路径。

在您的 Controller 操作中,您需要将此方法调用为 this.GetClientIP(new HttpContextWrapper(HttpContext.Current))

您的单元测试可以设置可模拟的上下文。更重要的是,您可以在上下文中设置预期是否调用了 Request 属性,或者是否进行了与 ip 地址相关的服务器变量调用。 (更不用说直接ip地址值验证了)

  • 您可以使用 FakeItEasy 或 Microsoft Moles 等为私有(private)方法创建私有(private)访问器。我通常不会那样做。

  • 您可以编写一个接口(interface)基础 INetworkUtility,它有一个方法可以为您提供 IP 地址。你的 Controller 可以使用这个接口(interface)。它也可以单独测试。

  • 你可以有一个公共(public)帮助类来获取 ip 地址,这可以进行单元测试。

如您所见,每个解决方案都需要权衡取舍。

从 Request 对象获取 IP 地址是一个独立的逻辑片段,与 mvc 或 web api 或 asp web 表单无关。 (虽然仍然是特定于 Web 的)所以将它作为辅助方法或基于接口(interface)的辅助方法并没有什么坏处。

就个人而言,我更喜欢内部方法(因为它几乎是私有(private)的)并且不需要太多代码更改。

关于c# - 我可以模拟一个私有(private)方法或者测试这个 POST 方法的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25148950/

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