我创建了一个只包含此类的空类库项目。
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);
}
}
从这个类中,我用 Intellitet 生成了一个测试项目。除了进行一些格式编辑以整理在此处发布之外,我没有对这个测试项目进行任何编辑。这仅包含以下 Intellitetest 测试。
[PexClass(typeof(DictionaryDemo)), TestClass]
public partial class DictionaryDemoTest
{
[PexMethod]
public void AddTest([PexAssumeUnderTest] DictionaryDemo target, string key, int value)
{
target.Add(key, value);
}
}
当我运行 Intellitet 方法时,我得到以下结果。
实际生成的测试本身似乎是合理的。我不确定低覆盖率是否表明应该生成更多测试来涵盖字典的复杂性,或者这是否源于以下问题。
我的担忧源于警告。我不明白为什么 Intellitet 会尝试创建这些类型的实例。我最初假设 Intellitet 试图设置该dictionary
字段并使用这些实例来实例化一个新的Dictionary
. 这是不受欢迎的行为,所以我添加了[PexExplorableFromConstructor(typeof(DictionaryDemo))]
应该(我相信)阻止任何直接设置私有字段的属性,但除了关于猜测如何创建DictionaryDemo
消失的警告之外,结果是相同的。
值得注意的是,它在这里尝试创建的许多类型甚至都无法访问。
所以问题基本上是,这里发生了什么?这是 Intellitet 的预期行为吗?如果这是 Intellitet 试图设置该dictionary
字段,那是不受欢迎的行为。我该如何阻止它,为什么不[PexExplorableFromConstructor]
阻止它?如果这不是正在发生的事情,为什么要尝试使用所有这些类型?
我已经尝试过的其他东西
我玩过一堆 PexCreatable... 和 PexExplorable... 属性但没有成功,包括[PexCreatableByConstructor(typeof(DictionaryDemo), MaySetRemainingFieldsByReflection = false)]
它似乎应该明确禁止该字段的设置。
我已经尝试创建一个DictionaryDemo
具有相同结果的工厂。
我试过添加 a[PexExplorableFromConstructor(typeof(Dictionary<string, int>))]
但这也没有效果。
这种行为在 VS 2015 和 VS 2017 RC 之间似乎是相同的。