FakeItEasy - фальсифицирующий абстрактный класс с пользовательскими атрибутами с параметрами в конструкторе, генерирует ArgumentException - PullRequest
0 голосов
/ 04 января 2019

Я получаю следующее исключение:

System.ArgumentException: «Поддерживаются только выражения констант и одномерных массивов»

При попытке подделать какой-то абстрактный объект с дополнительным атрибутом, который принимает параметры в конструкторе.

var foo = A.Fake<SelfComplementaryCustomizableTupleConsumer>(
            opt => opt.WithAttributes(
                () => new RequiredVariableNameAttribute(requiredVariableName,requiredVariableType)
                )
            );

Стоит упомянуть, что если я вызываю конструктор без аргументов, все в порядке. Что еще более интересно для меня, так это то, что если я подставлю переменные с константами, то проблема не появится.

Полный код:

string requiredVariableName = "abc";
Type requiredVariableType = typeof(string);


var foo = A.Fake<SelfComplementaryCustomizableTupleConsumer>(
          opt => opt.WithAttributes(
                () => new RequiredVariableNameAttribute(requiredVariableName,requiredVariableType)
                )
         );
var requiredVariables = foo.GetRequiredVariables();

Assert.IsTrue(requiredVariables.TryGetValue(requiredVariableName, out Type tmp));

1 Ответ

0 голосов
/ 05 января 2019

Это связано с анализом выражения создания атрибута . Он не поддерживает все возможные выражения, потому что это будет очень сложно. Я предполагаю, что было бы возможно обработать случай локальных переменных, но код находится в Castle.Core (который используется FakeItEasy), поэтому не ожидайте исправления очень скоро. Тем временем, используйте константы в выражении, если можете; если нет, то альтернативой является построение выражения вручную (используя Expression.Lambda<Func<Attribute>>(...)).

РЕДАКТИРОВАТЬ: я открыл выпуск в репозитории Castle.Core.

...