【问题标题】:Creating a unit test with a List<MyClass> Array使用 List<MyClass> 数组创建单元测试
【发布时间】:2011-12-02 08:43:45
【问题描述】:

我目前正在开发一个 C# 项目。我刚刚开始需要学习如何进行单元测试,并且发现它们很难理解其中的某些部分。我有一个返回 List 数组的函数,我需要测试这个方法是否正常工作。

当我右键单击 VS2010 中的方法并说创建单元测试时,它会为我创建以下代码:

    [TestMethod()]
    public void readStreamTest()
    {
        ReadStream target = new ReadStream(); // TODO: Initialize to an appropriate value
        Stream stream = new MemoryStream(); // TODO: Initialize to an appropriate value
        StreamWriter sw = new StreamWriter(stream);

        string line = "My Line 1\n¬My Line 2\nMy Line 3\nMy Line 4\nMy Line 5\nMy Line 6\nMy Line 7";
        int numLines = 5; // TODO: Initialize to an appropriate value
        List<FileLine> lines = new List<FileLine>();
        int i = 0;
        while ( i != 7 )
        {
            lines.Add(new FileLine()
            {
                lineNo = i,
                lineContent = line
            });
            i++;
        }
        List<FileLine> expected = lines; // TODO: Initialize to an appropriate value
        List<FileLine> actual;
        actual = target.readStream(stream, numLines);
        //Assert.AreEqual(expected, actual);
        Assert.IsNotNull(expected);
    }

其中一些,例如列表的初始化和使用数组向列表中添加项目是我自己添加的,以尝试弄清楚该怎么做。

如果有人可以就我如何测试它提供任何帮助,我看不出它如何与列表数组一起使用。

【问题讨论】:

  • 您具体遇到了什么问题?
  • 您正在寻找特殊的断言来比较列表?
  • @Robert Harvey 如何使用 UnitTest 测试列表数组。在实际程序中,它使用流来读取数据并将其输入到列表中,但是我该如何做这样的事情来测试单元测试。

标签: c# unit-testing list arraylist


【解决方案1】:

让我们先解决你的问题,然后我们可以谈谈一般的测试指针。

Assert.AreEqual 将比较引用相等性,这不是您想要的。您真正想要的是比较内容是否相同(我假设)。这可以使用Enumerable.SequenceEqual 方法来完成,如下所示:

Assert.IsTrue(expected.SequenceEqual(actual));

现在我们可以更一般地谈论测试。我有posted about this before,但我会尝试在这里总结一下主题。

关注行为!

单元测试应该是关于行为,而不是实现细节!这是我认为的第一个也是最基本的原则。它将通知您做出的所有其他决定。

为什么这么重要?

因为如果你不这样做,那么你的测试就会变得脆弱。 更改实施细节会破坏测试,这是不应该发生的。你的单元测试应该让你有信心重构和改进代码。如果您的测试与实现细节相关联,则不会发生这种情况,您将始终与您的测试作斗争。

那么这看起来像什么?好吧,让我们比较两个假设测试:

[TestMethod]
public void TestThatUserInfoIsValidatedAndSaved()
{
    var user = new User{Name = "Bob"};
    UserService.SaveUser(user);

    //Check that data access got called to see if Bob exists
    //Check that validation got called
    //Check that data access got called to save bob
}

[TestMethod]
public void ShouldSaveNewUser()
{
    var user = new User{Name = "Bob"};
    UserService.SaveUser(user);

    //Check that bob was saved
}

在前面的两种方法中,一种非常精细地测试方法的具体细节,而另一种只是测试预期的行为。如果我们改变该方法在后台的工作方式,那么第一个方法将会中断。但是,第二个测试应该可以继续正常工作。

您的测试应该描述“什么”系统做什么,而不是“如何”它是做什么的。

这样做,从长远来看,您将获得更好的单元测试体验。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多