我创建了一个只包含这个类的空类库项目。
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生成了一个测试项目。除了做一些格式化编辑,整理在这里张贴,我没有编辑这个测试项目。这只包含以下智能测试。
[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试图设置字段,则这是不需要的行为。我如何阻止它,为什么不停止它?如果不是这样的话,它为什么要使用所有这些类型呢?
其他我已经试过的东西
我和一群PexCreatable玩过.还有PexExplorable..。属性没有成功,包括[PexCreatableByConstructor(typeof(DictionaryDemo), MaySetRemainingFieldsByReflection = false)],它看起来应该显式地不允许字段的设置。
我尝试为DictionaryDemo创建一个具有相同结果的工厂。
我尝试过添加一个[PexExplorableFromConstructor(typeof(Dictionary<string, int>))],但这也没有效果。
这种行为在2015年和2017年之间似乎是相同的。
发布于 2017-08-01 19:53:29
我在探索使用它来测试代码中没有单元测试的自定义字典类型类时遇到了这个问题。
我能够通过创建一个实现接口的类并告诉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>))]有了这些变化,我再也没有收到这种警告。我知道这是个老问题,但我希望其他人也会遇到这个问题,这会对他们有所帮助。
https://stackoverflow.com/questions/41732491
复制相似问题