Есть ли простой способ проверить в модульном тесте, что два массива равны (то есть имеют одинаковое количество элементов и все элементы одинаковы?).
В Java я бы использовал assertArrayEquals (foo, bar);
, но, похоже, нет эквивалента для C #. Я пробовал Assert.AreEqual(new string[]{"a", "b"}, MyFunc("ab"));
, но даже несмотря на то, что функция возвращает массив с «a», «b», проверка все равно не выполняется.
Здесь используется Visual Studio 2008 Team Suite со встроенной средой модульного тестирования.
c#
visual-studio-2008
unit-testing
Антеру
источник
источник
object.Equals
и,IEqualityComparer<T>
возможно, потребуется определить их, чтобы передать неудачное утверждение.CollectionAssert.AreEquivalent
(доступен в Visual Studio 2010) дает более информативные результаты. Например, когда количество элементов различается, в сообщении указывается ожидаемое и фактическое количество элементовClass1.cs:
namespace ClassLibrary1 { public class Class1 { Array arr1 = new[] { 1, 2, 3, 4, 5 }; public Array getArray() { return arr1; } } }
ArrayEqualTest.cs:
[TestMethod()] public void getArrayTest() { Class1 target = new Class1(); Array expected = new []{1,2,3,4,5}; Array actual; actual = target.getArray(); CollectionAssert.AreEqual(expected, actual); //Assert.IsTrue(expected.S actual, "is the test results"); }
Успешный тест, обнаружена ошибка:
CollectionAssert.AreEqual failed. (Element at index 3 do not match.)
источник
В .NET 3.5, возможно, подумайте
Assert.IsTrue(foo.SequenceEqual(bar));
- хотя он не скажет вам, по какому индексу он отличается.источник
Хорошо, вот немного более длинный способ сделать это ...
static void Main(string[] args) { var arr1 = new[] { 1, 2, 3, 4, 5 }; var arr2 = new[] { 1, 2, 4, 4, 5 }; Console.WriteLine("Arrays are equal: {0}", equals(arr1, arr2)); } private static bool equals(IEnumerable arr1, IEnumerable arr2) { var enumerable1 = arr1.OfType<object>(); var enumerable2 = arr2.OfType<object>(); if (enumerable1.Count() != enumerable2.Count()) return false; var iter1 = enumerable1.GetEnumerator(); var iter2 = enumerable2.GetEnumerator(); while (iter1.MoveNext() && iter2.MoveNext()) { if (!iter1.Current.Equals(iter2.Current)) return false; } return true; }
источник