我目前正在使用Interface
模仿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是否删除了自定义属性?或者有没有办法允许他们通过?
答案 0 :(得分: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);
}