gpt4 book ai didi

c# - NUnit 3 CollectionConstraint 自定义 IComparer 不工作

转载 作者:行者123 更新时间:2023-11-28 20:50:36 26 4
gpt4 key购买 nike

问题

如何正确使用自定义 IComparer<T>对包含大量自定义接口(interface)引用的集合使用 NUnit3 集合约束?

我尝试过的

我有一个返回 IEnumerable<IInterface> 实例的类其中 IInterface定义如下:

public interface IInterface 
{
string PropertyOne { get; }

string PropertyTwo { get; }
}

我正在尝试将来自 NUnit3 的集合约束与自定义 IComparer<T> 结合使用,但它不起作用。要创建一个模拟对象进行测试, 我正在使用 Moq .测试大致如下所示:

[Test]
public void MyTest()
{
var mockObject = new Mock<IInterface>();
mockObject.Setup(x => x.PropertyOne).Returns("Foo");
mockObject.Setup(x => x.PropertyTwo).Returns("Bar");

var collection = myObject.Collection;

Assert.That(collection, Contains.Item(mockObject).Using(this));
}

测试用例包含在继承自以下基类的类中

public class TestBase : IComparer<IInterface> 
{
public int Compare(IInterface one, IInterface two) { /* some code */ }
}

当我在上面的 Compare 上设置断点时方法,我发现 NUnit 完全忽略了我的比较器,选择使用 ToString()底层对象上的实现,尽管它没有被接口(interface)公开。

最佳答案

这里的问题是如何Nunit3应该与自定义一起使用 IComparer<T>连同 Constraints .如果提供自定义比较器 Nunit3将其存储在所谓的外部比较器 列表中。每个IComparer<T>将在内部存储为 EqualityAdapter .稍后在比较点它将尝试转换 objectsT为了决定是否应该使用自定义比较器。

我们以您的示例为例,您有一个 ICollection<IInterface>但是 Constraint您创建的使用 Mock<IInterface> .显然IInterface无法与 Mock<IInterface> 相提并论.

我个人认为这具有误导性,因为问题会在运行时而不是编译时弹出。下面的例子将解释这个问题:

错误用法示例

//notice that Constraints is created for the int but IComparer<string> is used
List<string> strs = new List<string> {"1", "2", "3"};
Assert.That(strs, Contains.Item(5).Using((IComparer<string>) comparer));

正确用法示例

//notice that Constraints is created for the string and IComparer<string> is used
List<string> strs = new List<string> {"1", "2", "3"};
Assert.That(strs, Contains.Item("5").Using((IComparer<string>) comparer));

关于c# - NUnit 3 CollectionConstraint 自定义 IComparer<T> 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48852112/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com