2013-03-17 46 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

相关问题