2009-05-06 5 views
1

이메일 서비스 (SMTP 사용)에 대해 쓴 Unit Tests를보고 있는데, 특히 한 가지 테스트만으로 충분할 지 궁금합니다.단위 테스트가 충분합니까?

[PluginFamily("EmailService")] 
public interface IEmailService 
{ 
    Boolean SendEmail(string toAddress, string fromAddress, string bccAddress, string ccAddress, string subject, 
         string body, bool html); 
} 
[Pluggable("EmailService")] 
public class EmailService : IEmailService 
{ 
    private IConfigurationReader _configReader; 
    public EmailService(IConfigurationReader configurationReader) 
    { 
     _configReader = configurationReader; 
    } 
    public bool SendEmail(string toAddress, string fromAddress, string bccAddress, string ccAddress, string subject, string body, bool isHtml) 
    { 
     MailMessage email = new MailMessage(); 

     try 
     { 
      if (_configReader.TestMode) 
      { 
       toAddress = _configReader.TestEmailAddress; 
      } 
     } 

     //send email here 
    } 
} 

내가 IConfigurationReader (의 ConfigurationManager에 대한 기본적 래퍼)을 조롱하고 내 "테스트 모드"로 이메일을 보낼 수있는 경우 테스트하기 위해 true로 테스트 모드를 설정하고있다 : 여기 내 이메일 서비스의 조각이다 .

[Test] 
    public void Validate_Send_Email_In_Test_Mode() 
    { 
     bool result; 
     MockRepository mockRepository = new MockRepository(); 
     var mockConfigReader = mockRepository.StrictMock<IConfigurationReader>(); 


     using (mockRepository.Record()) 
     { 

      SetupResult.For(mockConfigReader.TestMode).Return(true); 
      SetupResult.For(mockConfigReader.TestEmailAddress).Return("[email protected]"); 
      SetupResult.For(mockConfigReader.EmailContentLocation).Return("test"); 
      SetupResult.For(mockConfigReader.SmtpHost).Return("test.mail.com"); 
     } 

     ObjectFactory.InjectStub(typeof(IConfigurationReader), mockConfigReader); 
     emailService = ObjectFactory.GetInstance<IEmailService>(); 

     using (mockRepository.Playback()) 
     { 
      result = emailService.SendEmail("[email protected]", 
                "[email protected]", "", "", 
                "this is a unit test - config in test mode", "body of unit test", true); 

     } 

     Assert.That(result, Is.True); 
     ObjectFactory.ResetDefaults(); 

    } 

이는 단위 테스트에 대한 충분인가 : 그래서 내 단위 테스트는이 (.이 방법에 내 단위 테스트 중 하나입니다 나는 100 %의 코드 커버리지를) 같이 보입니다? 그것을 개선하기 위해 무엇을 할 수 있습니까?

나는 내 방법이 사실로 돌아가고 있는지 확인하는 것만으로는 충분하지 않은 단위 테스트입니다.

답변

2

개선하여 code coverage (유형의 모든)

+2

많은 사람들이 코드 커버리지가 좋은 테스트의 큰 징후는 아니라고 말하지만 코드 커버리지가 2 % 인 경우에는 분명히 먼 길을 간다. 코드 커버리지가 처음이라면 98 %에 도달하고 마지막 예외가 발생할 때마다 걱정할 필요가 없습니다. 그냥 2 센트입니다. –

+0

Allen - 이메일 서비스에 대해 100 % 보장합니다. 나는 내 단위 테스트가 충분히 충분한 지보고 싶다고 생각한다 ... –

+1

100 % 기능 범위와 적절한 분기 커버리지가 좋은 표시가되어야한다. – workmad3

2

난 당신이 다양한 가능한 오류 조건이 충족 될 때 "성공"이다 음의 테스트를 포함하는 것이 좋습니다 것입니다. 예를 들어 잘못된 전자 메일 주소를 전달하고 적절한 오류 코드 및/또는 예외가 반환되는지 확인하십시오.

실제 SMTP 서버를 조롱 할 수도 있습니다. 나는 많은 수색을하지 않았지만, 나는 this SMTP server mock site을 발견했다. 나는 자바 프로젝트의 이메일 플러그인 테스트를 위해 이와 비슷한 방법을 사용했다. 그렇게하면 "테스트 모드"또는 생산 중이 건 상관 없습니다. 유일한 차이점은 구성에있는 서버/포트 조합입니다. 이것은 "테스트 코드"만 테스트하는 것이 아니라는 것을 보증하는 추가 이점이 있습니다.

1

나는이 부분 말할 것이다 :

{ 
     if (_configReader.TestMode) 
     { 
      toAddress = _configReader.TestEmailAddress; 
     } 
    } 

는 코드 냄새입니다. Toe-Mail 주소를 전달하고 메서드에 매개 변수로 전달 된 서비스가 호출되도록 설정하고 모의 객체를 사용하여 전자 메일 API에 올바르게 전송되었는지 확인해야합니다. 즉, 전자 메일 API를 조롱하고, Mock을 테스트 대상으로 사용하지 마십시오.

그것은 당신이, 첫째, 주변이 테스트를 다른 방법을 쓰기로 실험하는 데 도움이 될 수있는 위치 당신이 그것을 쓰기 정당화 테스트를 할 수있는 경우에만 작성됩니다 생산 코드입니다.

2

보낼 수 있습니까? 가능한 경우 적어도 두 가지 사례를 테스트하고 단일 테스트로는 충분하지 않습니다.

부울 반환 값을 가지고 있기 때문에 당신이 그렇게 다시 모든 가능성을 테스트하지 않는,이 개 리턴 코드 중 하나를 기대하고 있는지, 그 날에 건의 할 것입니다.

전자 메일을 보낼 때 반환 값은 함수의 결과 중 가장 중요하지 않습니다. 전자 메일이 전송 되었습니까?

관련 문제