Intellitest/Pex пытается создать IEqualityComparers для частного только для чтения поля словаря в объекте
Я создал пустой проект библиотеки классов, содержащий только этот класс.
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.
1 ответ
Я столкнулся с этой проблемой при изучении использования этого для тестирования пользовательского класса типа 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>))]
С этими изменениями я больше не получал это предупреждение. Я знаю, что это более старый вопрос, но я надеюсь, что кто-то еще столкнется с этим, это поможет им.