是否更好地测试是否需要在其内部或外部使用函数?

时间:2010-05-31 18:30:49

标签: c# asp.net function if-statement

最佳做法是什么? 调用一个函数然后返回,如果你测试某些东西,或测试一些东西然后调用?

我更喜欢函数内部的测试,因为它可以更容易地查看调用的函数。

例如:

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

进行

什么更好?

日Thnx

4 个答案:

答案 0 :(得分:13)

我觉得测试里面的功能更好。如果你在函数之外进行测试,那么你必须在任何地方测试可以调用的函数(并且会导致很多重复的代码)。

将所有东西放在一个地方然后到处散布是更好的。

答案 1 :(得分:8)

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

答案 2 :(得分:2)

在这种情况下,我觉得函数的名称意味着在每种情况下都会发生某些事情。有人可能想在非GET页面上调用FixURLCosmetics并期望发生某些事情。

我会将FixURLCosmetics重命名为FixGETURLCosmetics。然后,如果在非GET页面上调用它,则抛出异常。

答案 3 :(得分:0)

如果我是你,我会在两个地方进行测试,在外部和内部,并模拟被调用的内部组件(例如context.Request调用),以加强内部行为并嘲笑一些意想不到的回报和你的方法如何处理它们。

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