使用NSubstitute的自定义属性

时间:2016-06-14 07:52:30

标签: c# interface nsubstitute

我目前正在使用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是否删除了自定义属性?或者有没有办法允许他们通过?

1 个答案:

答案 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);
}