Dav*_*les 9 c# collections equality fluent-assertions
我正在实现一个不可变字典的特例,为了方便实现IEnumerable<KeyValuePair<Foo, Bar>>.通常修改字典的操作应该返回一个新实例.
到现在为止还挺好.但是当我尝试为类编写一个流畅的单元测试时,我发现我尝试过的两个流畅的断言库(Should和Fluent Assertions)都不支持对NotBeSameAs()实现的对象的操作IEnumerable- 除非你第一次执行他们来Object.
当我第一次碰到这个时,我认为它只是框架中的一个洞,但当我看到Fluent Assertions有同样的洞时,它让我觉得(因为我是C#的相对新人)我可能会遗漏一些关于C#集合的概念 - 当我提交问题时,应该隐含的作者.
显然还有其他方法来测试这个 - 投射Object和使用NotBeSameAs(),只是使用Object.ReferenceEquals,无论如何 - 但如果有充分的理由不这样做,我想知道那是什么.
AnIEnumerable<T>不一定是真实的对象。IEnumerable<T>保证您可以枚举它的状态。在简单的情况下,您有一个像List<T>已经具体化的容器类。然后您可以比较两个列表的地址。但是,您IEnumerable<T>也可能指向一系列命令,这些命令将在您枚举后执行。基本上是一个状态机:
public IEnumerable<int> GetInts()
{
yield return 10;
yield return 20;
yield return 30;
}
Run Code Online (Sandbox Code Playgroud)
如果将其保存在变量中,则没有可比较的对象(一切都是对象,所以你这样做......但这没有意义):
var x = GetInts();
Run Code Online (Sandbox Code Playgroud)
您的比较仅适用于物化(.ToList()或.ToArray())IEnumerables,因为这些状态机已被评估并且它们的结果已保存到集合中。所以是的,这个库实际上是有意义的,如果您知道您已经具体化了 IEnumerables,您将需要通过将它们转换为对象并“手动”调用该对象上所需的函数来公开这些知识。