代码之家  ›  专栏  ›  技术社区  ›  b0x0rz

测试一个函数是需要在它内部还是外部更好?

  •  12
  • b0x0rz  · 技术社区  · 16 年前

    调用一个函数然后返回如果你测试了什么,或者测试了什么然后调用?

    例如:

    protected void Application_BeginRequest(object sender, EventArgs e)
            {
                this.FixURLCosmetics();
            }
    

    private void FixURLCosmetics()
            {
                HttpContext context = HttpContext.Current;
                if (!context.Request.HttpMethod.ToString().Equals("GET", StringComparison.OrdinalIgnoreCase))
                {
                    // if not a GET method cancel url cosmetics
                    return;
                };
    
                string url = context.Request.RawUrl.ToString();
                bool doRedirect = false;
    
                // remove > default.aspx
                if (url.EndsWith("/default.aspx", StringComparison.OrdinalIgnoreCase))
                {
                    url = url.Substring(0, url.Length - 12);
                    doRedirect = true;
                }
    
                // remove > www
                if (url.Contains("//www"))
                {
                    url = url.Replace("//www", "//");
                    doRedirect = true;
                }
    
                // redirect if necessary
                if (doRedirect)
                {
                    context.Response.Redirect(url);
                }
            }
    

    这个好吗:

    if (!context.Request.HttpMethod.ToString().Equals("GET", StringComparison.OrdinalIgnoreCase))
                {
                    // if not a GET method cancel url cosmetics
                    return;
                };
    

    或者应该在 Application_BeginRequest

    什么更好?

    4 回复  |  直到 16 年前
        1
  •  13
  •   Miles    16 年前

    我觉得测试里面的功能比较好。如果在函数外部进行测试,则必须在可以调用该函数的任何地方进行测试(这将导致大量重复代码)。

    把所有的东西都放在一个地方,然后分散到任何地方都更好。

        2
  •  9
  •   pdr    16 年前

    如果一个方法在执行其函数之前绝对需要满足某个条件,那么是的,您应该将验证放在该函数中。另一方面,如果调用代码说“仅在这组条件下执行此操作”,则调用代码中的条件更好,因为下次要调用该方法时,可能不希望包含该条件。

        3
  •  2
  •   Mashmagar    16 年前

    在这种情况下,我觉得函数的名称意味着在任何情况下URL都会发生一些事情。可能有人想打电话 FixURLCosmetics 在非GET页面上,并期望发生一些事情。

    我会重新命名 定影化妆品 FixGETURLCosmetics

        4
  •  0
  •   Ari    16 年前

    如果我是你,我会在两个地方进行测试,在外部和内部,模拟正在调用的内部组件(比如context.Request调用),以增强内部行为,模拟一些意外的返回以及方法如何处理它们。

    在这种情况下,像easymock这样的API可以简化很多内部组件的模拟。

    推荐文章