【问题标题】:What tests should I write given the following code?给定以下代码,我应该编写哪些测试?
【发布时间】:2013-03-05 16:57:15
【问题描述】:

在编写单元测试时,我最苦恼的一件事是我要测试什么,不测试什么。

那么给定下面的代码,我应该写什么测试:

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&lt;T&gt; 编写一个测试来测试是否引发了异常,然后再编写一个测试来测试未引发的异常?我想我的问题是,我是否应该编写测试来测试预期的结果,然后完全相反?

    [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"); });
    }

【问题讨论】:

    标签: .net unit-testing


    【解决方案1】:

    您应该尽最大努力测试您的所有代码。这意味着所有公共方法和其中的场景都可以尽可能多地覆盖其所有内部逻辑。

    所以你应该编写 3 个测试:一个用于第一个异常,一个用于第二个异常,一个不抛出任何异常。

    关于这些测试的命名约定,这可能很有趣:https://stackoverflow.com/a/1594049/1373170

    【讨论】:

    • 如何命名这些测试?你有什么想法吗?
    【解决方案2】:

    单元测试的概念是确保您的代码完全按照您的预期工作,

    因此,如果您希望它抛出异常,则应测试它是否存在正确的异常。

    这里有一些关于编写单元测试的基本概念和技巧:

    http://www.slideshare.net/homespothq/unit-testing-concepts-and-best-practices

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 2021-08-08
      • 1970-01-01
      • 2019-08-19
      • 1970-01-01
      相关资源
      最近更新 更多