我创建了一个仅包含此类的空类库项目。
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之间的行为似乎相同。
答案 0 :(得分:0)
我在探索使用它来测试我们的代码中没有单元测试的自定义Dictionary类类时遇到了这个问题。
我能够通过创建一个实现接口的类并告诉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>))]
随着这些变化,我不再收到这个警告。我知道这是一个较老的问题,但我希望别人遇到这个问题,这会对他们有所帮助。