在编写单元测试时,我最挣扎的事情之一是我测试什么以及我不测试什么。
所以给出以下代码,我应该写什么测试:
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"); });
}
答案 0 :(得分:1)
您应该尽力测试所有代码。这意味着所有公共方法及其中的场景都能尽可能多地覆盖所有内部逻辑。
所以你应该编写3个测试:一个用于第一个例外,一个用于第二个,一个用于不投掷。
关于这些测试的命名约定,这可能是有意义的:https://stackoverflow.com/a/1594049/1373170
答案 1 :(得分:1)
单元测试的概念是确保您的代码完全按照预期的方式工作,
因此,如果您希望它抛出异常,则应对其进行测试以获得正确的异常。
这里有一些关于编写单元测试的基本概念和技巧:
http://www.slideshare.net/homespothq/unit-testing-concepts-and-best-practices