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

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方法时,我得到以下结果。





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

我的担心来自警告。我不明白为什么Intellitest会尝试创建这些类型的实例。我最初以为Intellitest试图设置dictionary字段,并使用这些实例实例化新的Dictionary。这是不希望有的行为,所以我添加了[PexExplorableFromConstructor(typeof(DictionaryDemo))]属性,该属性应该(我认为)可以防止直接设置私有字段,但是除了警告如何创建DictionaryDemo消失的警告外,结果是相同的。

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

所以问题基本上是,这里发生了什么?这是Intellitest的预期行为吗?如果这是Intellitest尝试设置dictionary字段,则这是不想要的行为。我如何停止它,为什么[PexExplorableFromConstructor]不停止它?如果不是这种情况,为什么要尝试使用所有这些类型?



我已经尝试过的其他东西

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

我试过为DictionaryDemo创建一个具有相同结果的工厂。

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

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

最佳答案

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

通过创建实现该接口的类并告诉IntelliTest使用该类,我能够解决警告。

该类非常简单:

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>))]


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

08-27 19:28