2013-03-17 47 views
3

編寫單元測試時我最擔心的事情之一是測試什麼,測試什麼。給我下面的代碼應該寫什麼測試?

因此,考慮下面的代碼,哪些測試我應該寫:

public static class Enforce 
{ 
    public static T ArgumentNotNull<T>(T parameter, string parameterName) where T : class 
    { 
     if (parameterName.IsNullOrWhiteSpace()) 
      throw new ArgumentNullException("parameterName"); 

     if (parameter.IsNull()) 
      throw new ArgumentNullException(parameterName); 

     return parameter; 
    } 

    public static string ArgumentNotNullOrEmpty(string parameter, string parameterName) 
    { 
     ArgumentNotNull(parameter, parameterName); 

     if (parameter.IsNullOrEmpty()) 
      throw new ArgumentException(parameterName); 

     return parameter; 
    } 

    public static string ArgumentNotNullOrWhiteSpace(string parameter, string parameterName) 
    { 
     ArgumentNotNull(parameter, parameterName); 

     if (parameter.IsNullOrWhiteSpace()) 
      throw new ArgumentException(parameterName); 

     return parameter; 
    } 

    public static T NotNull<T>(T instance) where T : class 
    { 
     instance.IfNullThrow<T, NullReferenceException>(String.Format(EnforceResources.TypeNotNull, typeof(T).FullName)); 

     return instance; 
    } 
} 

}

我應該寫一個測試爲ArgumentNotNull<T>是被拋出的異常測試,然後一個,對於異常測試不被拋出?我想我的問題是,我應該寫我的測試測試預期,然後完全相反?

[Fact] 
    public void ShouldThrowArgumentNullException() 
    { 
     object arg = null; 

     Assert.Throws<ArgumentNullException>(() => { Enforce.ArgumentNotNull(arg, "arg"); }); 
    } 

    [Fact] 
    public void ShouldNotThrowArgumentNullException() 
    { 
     var arg = "Test"; 

     Assert.DoesNotThrow(() => { Enforce.ArgumentNotNull(arg, "arg"); }); 
    } 

回答

1

您應該盡力測試您的所有代碼。這意味着所有的公共方法和他們的場景都可以儘可能多地覆蓋所有內部邏輯。

所以你應該寫3個測試:一個用於第一個異常,一個用於第二個,另一個用於沒有引發。

關於對這些測試,這可能是感興趣的命名約定:https://stackoverflow.com/a/1594049/1373170

+0

有關命名這些測試如何?你對可能的樣子有什麼想法嗎? – Sam 2013-03-17 07:38:33

+1

對於命名,這可能有所幫助:http://stackoverflow.com/a/1594049/1373170 – 2013-03-17 07:40:11

相關問題