Я могу заставить Moq добавлять атрибуты к ложному классу?

Вы можете использовать атрибут «target».

Здесь

22
задан abatishchev 20 May 2013 в 05:46
поделиться

1 ответ

Обновление: я только что понял, что можно на самом деле добавить атрибуты к существующему типу при помощи TypeDescriptor. AddAttributes, который может быть выполнен против экземпляра или тип:

Mock<IRepository> repositoryMock = new Mock<IRepository>();

CustomAttribute attribute = new CustomAttribute();

// option #1: to the instance
TypeDescriptor.AddAttributes(repositoryMock.Object, attribute );

// option #2: to the generated type
TypeDescriptor.AddAttributes(repositoryMock.Object.GetType(), attributes);

при необходимости в нем AddAttribute возвращает TypeDescriptorProvider, который может быть передан TypeDescriptor. RemoveProvider для удаления атрибутов впоследствии.

знать тот Атрибут. GetCustomAttributes не найдет атрибуты добавленными во времени выполнения таким образом. Вместо этого используйте TypeDescriptor. GetAttributes.

Исходный Ответ

я не делаю живо, Moq (или любая другая платформа насмешки в этом отношении) поддерживает пользовательские атрибуты. Я действительно знаю, что замок Proxy (платформа, наиболее часто используемая для фактического создания класса) , делает поддержка это, но не было бы никакого способа получить доступ к нему через Moq.

Ваш лучший выбор состоит в том, чтобы абстрагировать Ваш метод загрузки Атрибутов в интерфейс (который принимает Тип и тип Атрибута), и затем дразните это.

Редактирование: , Например:

public interface IAttributeStrategy
{
    Attribute[] GetAttributes(Type owner, Type attributeType, bool inherit);
    Attribute[] GetAttributes(Type owner, bool inherit);
}

public class DefaultAttributeStrategy : IAttributeStrategy
{
    public Attribute[] GetAttributes(Type owner, Type attributeType, bool inherit)
    {
        return owner.GetCustomAttributes(attributeType, inherit);
    }

    public Attribute[] GetAttributes(Type owner, bool inherit)
    {
        return owner.GetCustomAttributes(inherit);
    }
}

класс, которому нужны атрибуты, использует экземпляр IAttributeStrategy (или через контейнер МОК, или наличие его дополнительно передало в конструктора). Обычно это будет DefaultAttributeStrategy, но можно теперь дразнить IAttributeStrategy для переопределения вывода.

Это могло бы звучать замысловатым, но добавление слоя абстракции намного легче, чем попытка к попытке на самом деле дразнить Атрибуты.

32
ответ дан Jeff Yates 29 November 2019 в 05:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: