2010-05-31 8 views
11

Was ist die beste Praxis? rufen Sie eine Funktion, dann zurück, wenn Sie für etwas testen, oder für etwas testen dann anrufen?ist es besser zu testen, ob eine Funktion innerhalb oder außerhalb davon benötigt wird?

Ich bevorzuge den Test innerhalb der Funktion, weil es eine einfachere Betrachtung dessen, was Funktionen genannt werden, macht.

zum Beispiel:

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

und

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); 
      } 
     } 

ist das gut:

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

oder sollte dieser Test in Application_BeginRequest getan werden?

was ist besser?

thnx

+1

+1 Ich habe gerade über die gleiche Frage nachgedacht ... –

+0

hehe, ich war unsicher, ob ich es posten wollte oder nicht, aber ich arbeite an einem komplett neuen Projekt im Visual Studio und möchte die Best Practices für alles bekommen Ich benutze (und ich habe die Zeit im Moment, also warum nicht), also dachte ich, was zur Hölle): P und euch lieben Antworten auf Fragen :) – b0x0rz

+3

Weder - Sie sollten das URL Rewrite-Modul in IIS verwenden. – Jon

Antwort

11

ich wie Tests im Inneren fühlen die Funktion besser ist. Wenn Sie außerhalb der Funktion testen, müssen Sie überall testen, ob diese Funktion aufgerufen werden kann (und eine Menge doppelten Code verursachen würde).

Es ist schöner, alles an einem Ort zu haben, als überall verteilt.

+0

Ich vergaß, über den Fall zu denken, wenn es von mehr als einem Ort, so thnx :) – b0x0rz

+0

+1 Ich mache das gleiche rein auf Code-Duplikation Argument - aber ich finde oft den Test vor Funktionsaufruf besser lesbar .. –

6

Wenn eine Methode unbedingt eine bestimmte Bedingung erfüllen muss, bevor sie ihre Funktion ausführen kann, dann sollten Sie die Validierung in diese Funktion einfügen. Wenn andererseits Ihr Aufrufcode besagt, dass "nur diese Operation unter diesen Bedingungen ausgeführt werden soll", ist die Bedingung im aufrufenden Code besser, da Sie diese Bedingung beim nächsten Aufruf dieser Methode möglicherweise nicht berücksichtigen möchten .

+0

+1 Gute Argumentation –

+0

musste ein paar Mal neu gelesen werden, aber yep es macht Sinn! – b0x0rz

2

In diesem Fall glaube ich, dass der Name der Funktion impliziert, dass in jedem Fall etwas mit der URL passieren wird. Jemand möchte möglicherweise FixURLCosmetics auf einer Nicht-GET-Seite aufrufen und erwarten, dass etwas passiert.

Ich würde FixURLCosmetics zu FixGETURLCosmetics umbenennen. Werfen Sie dann eine Ausnahme aus, wenn sie auf einer Nicht-GET-Seite aufgerufen wird.

+0

ich mag diese Idee auch :) schön. Danke. – b0x0rz

0

Wenn ich Sie wäre, würde ich an BEIDEN Orten testen, draußen und drinnen sein und die inneren Komponenten, die aufgerufen werden (wie Kontext.Anfragen), verspotten, um auch das innere Verhalten zu stärken und auch einige unerwartete Renditen zu verspotten und wie deine Methode mit ihnen umgeht.

In diesem Fall könnte eine API wie easymock A LOT die Verspottung der inneren Komponenten vereinfachen.

Verwandte Themen