gpt4 book ai didi

c# - Intellitest/Pex 正在尝试为对象中的私有(private)只读字典字段创建 IEqualityComparers

转载 作者:行者123 更新时间:2023-11-30 12:56:21 24 4
gpt4 key购买 nike

我创建了一个只包含此类的空类库项目。

public class DictionaryDemo
{
private readonly Dictionary<string, int> dictionary = new Dictionary<string, int>();

public void Add(string key, int value)
{
this.dictionary.Add(key, value);
}
}

在这门课上,我用 Intellitest 生成了一个测试项目。除了进行一些格式编辑以整理发布在这里外,我没有对这个测试项目进行任何编辑。这仅包含以下 Intellitest 测试。

[PexClass(typeof(DictionaryDemo)), TestClass]
public partial class DictionaryDemoTest
{
[PexMethod]
public void AddTest([PexAssumeUnderTest] DictionaryDemo target, string key, int value)
{
target.Add(key, value);
}
}

当我运行 Intellitest 方法时,我得到以下结果。

enter image description here enter image description here enter image description here

实际生成的测试本身似乎是合理的。我不确定低覆盖率是否表明应该生成更多测试来覆盖字典的复杂性,或者是否源于以下问题。

我的担忧源于警告。我不明白为什么 Intellitest 会尝试创建这些类型的实例。我最初假设 Intellitest 试图设置 dictionary字段并使用这些实例来实例化一个新的 Dictionary .这是不受欢迎的行为,所以我添加了 [PexExplorableFromConstructor(typeof(DictionaryDemo))]应该(我相信)防止私有(private)字段的任何直接设置的属性,但除了关于猜测如何创建 DictionaryDemo 的警告之外消失,结果是相同的。

值得注意的是,它试图在此处创建的许多类型甚至无法访问。

所以问题基本上是,这里发生了什么?这是 Intellitest 的预期行为吗?如果这是 Intellitest 试图设置 dictionary场,这是不受欢迎的行为。我该如何阻止它,为什么 [PexExplorableFromConstructor] 没有?停下来?如果事实并非如此,为什么要尝试使用所有这些类型?


我已经尝试过的其他内容

我玩过一堆 PexCreatable... 和 PexExplorable... 属性但没有成功,包括 [PexCreatableByConstructor(typeof(DictionaryDemo), MaySetRemainingFieldsByReflection = false)]这似乎应该明确禁止该字段的设置。

我试过为 DictionaryDemo 创建工厂结果相同。

我试过添加 [PexExplorableFromConstructor(typeof(Dictionary<string, int>))]但这也没有效果。

此行为在 VS 2015 和 VS 2017 RC 之间似乎是相同的。

最佳答案

我在探索使用它来测试我们代码中没有单元测试的自定义字典类型类时遇到了这个问题。

我能够通过创建一个实现接口(interface)的类并告诉 IntelliTest 使用它来解决警告。

类(class)非常简单:

public class DefaultEqualityComparer<T> : IEqualityComparer<T>
{
readonly EqualityComparer<T> _comparer = System.Collections.Generic.EqualityComparer<T>.Default;

public bool Equals(T x, T y) => _comparer.Equals(x, y);

public int GetHashCode(T obj) => _comparer.GetHashCode(obj);
}

在 PexAssemblyInfo.cs 文件中,我添加了以下属性:

[assembly: PexUseType(typeof(DefaultEqualityComparer<int>))]

通过这些更改,我不再收到该警告。我知道这是一个较老的问题,但我希望其他人遇到这个问题,这会对他们有所帮助。

关于c# - Intellitest/Pex 正在尝试为对象中的私有(private)只读字典字段创建 IEqualityComparers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41732491/

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