我创建了一个仅包含此类的空类库项目。
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>))]
有了这些更改,我不再收到该警告。我知道这是一个比较老的问题,但是我希望其他人也会遇到这个问题,它将对他们有所帮助。