C# Visual Studio单元测试Assert.AreEqual失败,预期值和实际值相同

C# Visual Studio单元测试Assert.AreEqual失败,预期值和实际值相同,c#,.net,visual-studio-2010,unit-testing,C#,.net,Visual Studio 2010,Unit Testing,当涉及到单元测试时,我是一个完全的新手,所以如果这是完全的无知,请原谅我。但是,即使我为预期值和实际值提供了完全相同的值,我也无法使此方法通过单元测试。当我设置断点并逐步执行时,我已经确认预期变量和实际变量都是一个字符串数组,包含两个项目,blah和blah。但每次声明“Assert.AreEqual失败。预期:System.String[]实际:System.String[]”时,测试仍然失败 namespace TestProject1 { 公共类测试 { 公共字符串[]PMDate(字符串

当涉及到单元测试时,我是一个完全的新手,所以如果这是完全的无知,请原谅我。但是,即使我为预期值和实际值提供了完全相同的值,我也无法使此方法通过单元测试。当我设置断点并逐步执行时,我已经确认预期变量和实际变量都是一个字符串数组,包含两个项目,blah和blah。但每次声明“Assert.AreEqual失败。预期:System.String[]实际:System.String[]”时,测试仍然失败

namespace TestProject1
{
公共类测试
{
公共字符串[]PMDate(字符串lastPm)
{
if(string.IsNullOrEmpty(lastPm))
返回新的[]{“blah”,“blah”};
string[]results=lastPm.Split(新[]{”“},StringSplitOptions.None);
如果(结果长度<2)
返回新的[]{“blah”,“blah”};
返回结果;
}
}
[TestClass()]
公共类UnitTest1
{
[TestMethod()]
公共无效PmDateTest()
{
测试=新测试();
字符串[]应为test.PMDate(“01/01/1900”);
字符串[]实际值=test.PMDate(“01/01/1900”);
断言.AreEqual(预期、实际);
}
}

}

您的测试将使用
对象.Equals
,它不会被数组覆盖。换句话说,这将打印false:

var x = new[] { 0 };
var y = new[] { 0 };
Console.WriteLine(x.Equals(y));
您应改为对集合使用:

CollectionAssert.AreEqual(expected, actual);

这是失败的,因为字符串数组是两个不同的对象,即使它们包含相同的值,它们也是不同的对象。您可以通过在运行时检查expected.GetHashcode()和actual.GetHashcode()来验证这一点,您将看到散列代码是不同的

CollectionAssert似乎没有在单元测试教程中广泛宣传,这是非常有用的
CollectionAssert.AreEqual(expected, actual);