2010-06-07 5 views
4

를 정리하는 간단한 C#을 래퍼 만들기 :는이 코드를 코드

public void Contacts(string domainToBeTested, string[] browserList, string timeOut, int numberOfBrowsers) 
    { 
     verificationErrors = new StringBuilder(); 

     for (int i = 0; i < numberOfBrowsers; i++) 
     { 
      ISelenium selenium = new DefaultSelenium("LMTS10", 4444, browserList[i], domainToBeTested); 

      try 
      { 
       selenium.Start(); 
       selenium.Open(domainToBeTested); 

       selenium.Click("link=Email"); 
       Assert.IsTrue(selenium.IsElementPresent("//div[@id='tabs-2']/p/a/strong")); 

       selenium.Click("link=Address"); 
       Assert.IsTrue(selenium.IsElementPresent("//div[@id='tabs-3']/p/strong")); 

       selenium.Click("link=Telephone"); 
       Assert.IsTrue(selenium.IsElementPresent("//div[@id='tabs-1']/ul/li/strong")); 
      } 
      catch (AssertionException e) 
      { 
       verificationErrors.AppendLine(browserList[i] + " :: " + e.Message); 
      } 
      finally 
      { 
       selenium.Stop(); 
      } 
     } 
     Assert.AreEqual("", verificationErrors.ToString(), verificationErrors.ToString()); 
    } 

내 문제는 내가 내가이 많은 여러 번 '시도'주변의 코드를 사용할 수 있도록 그것을 확인하고 싶은 것입니다 나머지 코드. 나는 그것이 래퍼와 관련이 있다고 생각하지만, 웹에서 이것에 대한 간단한 대답을 얻을 수는 없다.

간단히 말해서이 코드의 유일한 부분은 try {}와 나머지 사이의 비트이며 현재 100 번 이상 사용하고 유지 관리하는 것으로 나타났습니다.

희망이 있습니다. 많은 감사드립니다.

답변

8

두 명백하고 어느 정도 동등한 제안 :

  • 는 try 블록 내의 코드를 표현하기 위해 대리자를 사용합니다 (예 : Action<ISelenium>)
  • 사용 try 블록
  • 내에서 코드를 표현하는 인터페이스

대리자 (또는 인터페이스) 유형의 매개 변수를 허용하도록 기본 메서드를 변경하고 try 블록에서 실행하십시오.

public void Contacts(string domainToBeTested, string[] browserList, 
        string timeOut, int numberOfBrowsers, 
        Action<ISelenium> test) 
{ 
    verificationErrors = new StringBuilder(); 

    for (int i = 0; i < numberOfBrowsers; i++) 
    { 
     ISelenium selenium = new DefaultSelenium 
      ("LMTS10", 4444, browserList[i], domainToBeTested); 

     try 
     { 
      test(selenium); 
     } 
     catch (AssertionException e) 
     { 
      verificationErrors.AppendLine(browserList[i] + " :: " + e.Message); 
     } 
     finally 
     { 
      selenium.Stop(); 
     } 
    } 
    Assert.AreEqual("", verificationErrors.ToString(), 
        verificationErrors.ToString()); 
} 

어느 쪽이든, 변경하지 않는 비트와 그렇지 않은 비트는 분리되어 있습니다. 아마도 C# 3을 사용하는 경우에는 대리자 양식을 사용할 것입니다. 그런 다음 메서드 내에서 코드를 삽입하고 메서드 그룹 변환을 사용하거나 작은 블록에 람다 식을 사용할 수 있습니다.

0

간단히 추출하지 않는 이유는 무엇입니까?

public string TestSelenium(ISelenium selenium) { 
     try 
     { 
      selenium.Start(); 
      selenium.Open(domainToBeTested); 

      selenium.Click("link=Email"); 
      Assert.IsTrue(selenium.IsElementPresent("//div[@id='tabs-2']/p/a/strong")); 

      selenium.Click("link=Address"); 
      Assert.IsTrue(selenium.IsElementPresent("//div[@id='tabs-3']/p/strong")); 

      selenium.Click("link=Telephone"); 
      Assert.IsTrue(selenium.IsElementPresent("//div[@id='tabs-1']/ul/li/strong")); 
     } 
     catch (AssertionException e) 
     { 
      return e.Message; 
     } 
     finally 
     { 
      selenium.Stop(); 
     } 

     return String.Empty; 
    } 
2

당신은 그것을 달성하기 위해 대표단을 사용할 수 있습니다

var result = Contacts(/* your arguments */, ACallback); 

그리고

private void ACallback(ISelenium selenium) 
{ 
    selenium.Start(); 
    selenium.Open(domainToBeTested); 

    selenium.Click("link=Email"); 
    Assert.IsTrue(selenium.IsElementPresent("//div[@id='tabs-2']/p/a/strong")); 

    selenium.Click("link=Address"); 
    Assert.IsTrue(selenium.IsElementPresent("//div[@id='tabs-3']/p/strong")); 

    selenium.Click("link=Telephone"); 
    Assert.IsTrue(selenium.IsElementPresent("//div[@id='tabs-1']/ul/li/strong")); 
} 

참고 :

public void Contacts(string domainToBeTested, string[] browserList, string timeOut, int numberOfBrowsers, Action<ISelenium> callback) 
{ 
    verificationErrors = new StringBuilder(); 

    for (int i = 0; i < numberOfBrowsers; i++) 
    { 
     ISelenium selenium = new DefaultSelenium("LMTS10", 4444, browserList[i], domainToBeTested); 

     try 
     { 
      // Here the delegate is called 
      callback(selenium); 
     } 
     catch (AssertionException e) 
     { 
      verificationErrors.AppendLine(browserList[i] + " :: " + e.Message); 
     } 
     finally 
     { 
      selenium.Stop(); 
     } 
    } 
    Assert.AreEqual("", verificationErrors.ToString(), verificationErrors.ToString()); 
} 

호출처럼 보이는 그냥 ISelenium하고보다 더 많은 인수를 전달할 수 물론 결과를 반환하십시오 (대신 Func<> 사용).3210).

관련 문제