2016-06-14 7 views
2

Я сейчас издеваюсь над Interface с NSubstitute, который представляет собой представление класса с двумя свойствами и одним методом.Пользовательские атрибуты с NSubstitute

LoginViewModel = Substitute.For<ILoginViewModel>(); 

Исключенный интерфейс создается, затем передается в метод, который отражает его, чтобы получить все пользовательские атрибуты.

LoginViewModel.Username = "User1"; 
LoginViewModel.Password = "Password1"; 

Каждое из свойств на конкретной реализации интерфейса имеет один пользовательский атрибут, однако при отражении, компилятор не показывает пользовательские атрибуты.

[CustomRequired] 
public string Username { get; set; } 

[CustomRequired] 
public string Password { get; set; } 

Испытание это без NSubstitute работает. Мой вопрос: запрещает ли NSubstitute настраивать атрибуты? Или есть способ разрешить им это?

ответ

1

Я не знаю слишком много о пользовательских атрибутах, поэтому в моем ответе стоит double checking the information.

Во-первых, NSubstitute делает листок some specific attributes, но не атрибуты в целом. (Помимо этого: NSubstitute использует Castle DynamicProxy для генерации прокси-типов, поэтому, чтобы быть более точным, NSubstitute просит Castle DP удалить их. :))

Во-вторых, если атрибуты объявлены на интерфейсе, они будут not flow on to the class. Однако они будут доступны через сам интерфейс. Кроме того, они будут доступны, если объявлен класс и заменителей для данного класса (при условии, что атрибут не задан явно prevent being inherited):

public class MyAttribute : Attribute { } 
public interface IHaveAttributes { 
    [My] string Sample { get; set; } 
} 
public class HaveAttributes : IHaveAttributes { 
    [My] public virtual string Sample { get; set; } 
} 
public class NoAttributes : IHaveAttributes { 
    public virtual string Sample { get; set; } 
} 

[Test] 
public void TestAttributes() 
{ 
    // WORKS for class: 
    var sub = Substitute.For<HaveAttributes>(); 
    var sampleProp = sub.GetType().GetProperty("Sample"); 
    var attributes = Attribute.GetCustomAttributes(sampleProp, typeof(MyAttribute)); 
    Assert.AreEqual(1, attributes.Length); 

    // WORKS directly from interface: 
    var sampleInterfaceProp = typeof(IHaveAttributes).GetProperty("Sample"); 
    var attributes2 = Attribute.GetCustomAttributes(sampleInterfaceProp, typeof(MyAttribute)); 
    Assert.AreEqual(1, attributes2.Length); 

    // Does NOT go from interface through to class (even non-substitutes): 
    var no = new NoAttributes(); 
    var sampleProp2 = no.GetType().GetProperty("Sample"); 
    var noAttributes = Attribute.GetCustomAttributes(sampleProp2, typeof(MyAttribute)); 
    Assert.IsEmpty(noAttributes); 
} 
+0

Спасибо за ответ - я добавил пользовательские атрибуты как на интерфейсе и класса, однако атрибутов по-прежнему нет. Вот скриншот отраженного типа: http://i.imgur.com/xjPKLqF.png – TheGeekZn

+0

Снимок экрана показывает, что он все еще ищет объявление типа «ILoginViewModelProxy». Вы замените класс ('LoginViewModel'?), Если вы хотите, чтобы члены имели эти атрибуты. –

+0

Ahh имеет смысл! Большое спасибо - работаю сейчас :) – TheGeekZn

Смежные вопросы