Странная ошибка "число общих аргументов не равно арности" в модульном тесте после компиляции и работы программы
Я создал общий класс, как показано ниже, который отлично работал, когда я его кодировал и тестировал программу в Visual Studio. Однако в автоматической сборке выполнялся модульный тест, который не может работать со сборкой, хотя ранее не было замечено ни ошибки компиляции, ни времени выполнения:
Ошибка 18 Ошибка при обработке сборки ".... dll": количество предоставленных универсальных аргументов не равно арности определения общего типа. Имя параметра: экземпляр... Тест
В модульном тесте не используется универсальный класс.
Я закомментировал весь код, конструктор, поле из класса, затем автоматически реализовал интерфейсы с Visual Studio, генерируя заглушки с помощью метода throw new NotImplementedException().
public class RequiredPropertiesProfile<TPropertyGroup, TProperty>
: IDictionary<bool, IDictionary<TPropertyGroup, ICollection<TProperty>>>
{
// auto implementations of IDictionary, with throw new NotImplementedException();
}
Он снова скомпилирован, но компиляция модульного теста снова не удалась, без видимой причины. В тесте упоминается "Microsoft.VisualStudio.QualityTools.UnitTestFramework".
Этот класс предназначен главным образом для определения конфигураций свойств, которые необходимо установить или не устанавливать (bool). Предполагается, что он должен быть общим: иметь строки (удобные для пользователя, включая вспомогательные классы), объекты данных или идентификаторы базы данных (тип int) с дополнительными методами для преобразования одного в другое.
Я нашел несколько статей об этой ошибке, но ни одна из них не подходит для моего случая - особенно компиляция и запуск без ошибок сначала, а затем наткнулся на глупый модульный тест, который даже не использует универсальный класс.
1 ответ
Хотя это и не является ответом на причину проблемы, это помогло создать базовый класс с полностью универсальным интерфейсом, а затем поместить мою реализацию с типом bool 1-го уровня сверху:
public class RequiredPropertiesGenericBase<TState, TPropertyGroup, TProperty>
: IDictionary<TState, IDictionary<TPropertyGroup, ICollection<TProperty>>>
{
private _innerDict = new Dictionary<TState, IDictionary<TPropertyGroup, ICollection<TProperty>>>();
// _innerDict wrapping methods;
}
public class RequiredPropertiesProfile<TPropertyGroup, TProperty>
: RequiredPropertiesGenericBase<bool, TPropertyGroup, TProperty>
{
public RequiredPropertiesProfile(IEnumerable<PropSetting> settings)
{
foreach (var set in settings)
{
this.AddPropertySetting(set.MustBeSet, set.PropertyGroup, set.Property);
}
// ...
}
// implementation
}
Я до сих пор не знаю, что вызвало это, и все еще очень странно, что исходный код будет компилироваться и выполняться, но наткнется на юнит-тест, даже не создавая экземпляры класса (но используя его сборку).
Проблема может возникнуть на нескольких машинах, во-первых, на сборочной машине с автоматическими модульными тестами (обычно выполняющими полную очистку перед сборкой / тестированием). Затем также на рабочей станции, при запуске модульного теста.
Проблема все еще возникала в начальной версии, после удаления конструктора (оставив только конструктор auto) и весь код, кроме реализаций поддельного интерфейса, при этом класс не использовался нигде.