在C#测试中有两个字符串[]和AreEqual的错误

时间:2012-06-12 07:20:45

标签: c# unit-testing mstest

我的c#测试方法有问题。

看起来像:

public void GetRolesTest()
{
    RoleProvider target = new RoleProvider(); 
    string username = "FOO"; 
    string[] expected = new string[2];
    expected[0] = "Admin";
    expected[1] = "User";
    string[] actual;
    actual = target.GetRoles(username);
    Assert.AreEqual<string[]>(expected, actual);
}

测试的方法只做以下几点:

public override string[] GetRoles(string username)
{
    string[] output = new string[2];
    output[0] = "Admin";
    output[1] = "User";
    return output;
}

运行测试后,我收到以下错误:

Error in "Assert.AreEqual". Expected:<System.String[]>. Acutally:<System.String[]>.
可以告诉我那里有什么问题吗?

2 个答案:

答案 0 :(得分:5)

您获得例外的原因是Assert.AreEqual将使用默认比较器作为类型,如果string[]是简单参考比较(actualexpected不同对象 - 不同的引用。)

您可以改为使用集合断言:

CollectionAssert.AreEquivalent(expected, actual);

或者,使用LINQ进行true验证:

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

答案 1 :(得分:2)

您在此处测试的是actualexpected是否是相同的数组实例,而实际情况并非如此。我建议明确地测试数组内容,如下所示:

Assert.Contains( "Admin", actual );
Assert.Contains( "User", actual );
Assert.Equals( 2, actual.Length );

根据您的单元测试库,代码可能会略有不同,但我希望您能看到我的目标。