我如何为这样的东西编写单元测试?

时间:2014-02-28 21:08:53

标签: c# tdd

所以我知道TDD你应该首先编写测试,但是我不能理解如何为下面的代码编写测试。有人可以在起点帮助我吗?

private string GetWMIProperty(string property)
{
    string value = string.Empty;
    SelectQuery selectQuery = new SelectQuery("Win32_OperatingSystem");
    using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(selectQuery))
    {

        foreach (ManagementObject mo in searcher.Get())
        {
             value = mo[property].ToString();
        }
    }
    return value;
}

1 个答案:

答案 0 :(得分:6)

你只是为方法的各种结果编写测试,这样你就可以定义方法的预期行为而不用实际编写方法:

[TestMethod]
public MyClass_GetWMIProperty_GivenGoodInput_ReturnsString()
{
    var myClass = new MyClass();
    var result = myClass.GetWMIProperty("goodinput");
    Assert.IsNotNull(result);
}

[TestMethod]
public MyClass_GetWMIProperty_GivenNullInput_ThrowsArgumentNullException()
{
    var myClass = new MyClass();

    try
    {
        var result = myClass.GetWMIProperty(null);
    }
    catch (ArgumentNullException)
    {
        // Good
        return;
    }

    // Exception not thrown
    Assert.Fail();
}

[TestMethod]
public MyClass_GetWMIProperty_GivenBadInput_ReturnsNull()
{
    var myClass = new MyClass();
    var result = myClass.GetWMIProperty("badinput");
    Assert.IsNull(result);
}

您的方法将如下所示:

// Note public/internal so tests can see it
public string GetWMIProperty(string property)
{
    // Stubbed
    throw new NotImplementedException();
}

这三种测试方法在这种状态下都会失败,因为NotImplementedException将被抛出而不会被其中任何一种捕获。

接下来,您将编写方法的实际内容,以便您可以在这些测试中调用它们,它们都会通过。 TDD的核心思想是测试定义行为。我们在这里定义了:

  • 良好的输入返回字符串
  • 错误输入返回null
  • null input抛出ArgumentNullException。