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>))]

С этими изменениями я больше не получал это предупреждение. Я знаю, что это более старый вопрос, но я надеюсь, что кто-то еще столкнется с этим, это поможет им.

Другие вопросы по тегам