4

我有一个测试场景,我想检查两个集合是否相等。我找到了这个类Microsoft.VisualStudio.QualityTools.UnitTesting.CollectionAssert,但它只适用于ICollection<T>. 由于我正在测试 Entity Framework 的存储库,因此需要比较IObjectSet<T>s,这不会 -IObjectSet<T>不会实现ICollection<T>.

有什么方法可以使用这个类来比较集合,还是我必须创建自己的实现?(为什么微软团队不让这个类使用IEnumerable<T>,因为那是集合的“基本接口”?)

编辑:这是我的测试代码:

// Arrange
var fakeContext = new FakeObjectContext();
var dummies = fakeContext.Dummies;
var repo = new EFRepository<DummyEntity>(fakeContext);

// Act
var result = repo.GetAll();

// Assert
Assert.IsNotNull(result, NullErrorMessage(MethodName("GetAll")));
Assert.IsInstanceOfType(result, typeof(IEnumerable<DummyEntity>), IncorrectTypeMessage(MethodName("GetAll"), typeof(IEnumerable<DummyEntity>)));
CollectionAssert.AreEqual(dummies.ToList(), result.ToList());

最后一行的CollectionAssert.AreEqual调用失败,指出索引 0 处的元素不相等。我究竟做错了什么?

4

2 回答 2

3

一个厚颜无耻的选择(虽然没有那么多信息)是断言expected.SequenceEqual(actual)返回true

您可以编写一个强制收集(.ToList()在每个上)的包装器方法吗?但老实说,您不妨只调用.ToList()单元测试代码:

CollectionAssert.AreEqual(expected.ToList(), actual.ToList()); // but tidier...
于 2010-01-16T08:33:07.297 回答
2

如果您要比较结果集,您可能需要使用CollectionAssert.AreEquivalent来忽略顺序。您还应该确保您已在要比较的元素类型上实现了 Equals。

于 2010-01-16T13:48:35.713 回答