Type 拡張メソッドのテストに使用するクラスのスニペットを次に示します。
class Something
{
[StringLength(100, MinimumLength = 1, ErrorMessage = "Must have between 1 and 100 characters")]
public string SomePublicString { get; set; }
}
次の拡張メソッドがあります。
public static class TypeExtensions
{
public static TAttributeType GetCustomAttribute<T, TAttributeType, TProperty>(this T value, Expression<Func<T, TProperty>> propertyLambda, bool inherit = false)
{
var type = typeof(T);
var member = (MemberExpression)propertyLambda.Body;
var propertyInfo = (PropertyInfo)member.Member;
var customAttributes = propertyInfo.GetCustomAttributes(typeof(TAttributeType), inherit);
return customAttributes.OfType<TAttributeType>().FirstOrDefault();
}
}
単体テストでの使用:
1: var something = new Something();
2: var actual = something.GetCustomAttribute<Something, StringLengthAttribute, string>(x => x.SomePublicString);
3: actual.MinimumLength.Should().Be(1);
4: actual.MaximumLength.Should().Be(100);
5: actual.ErrorMessage.Should().Be("Must have between 1 and 100 characters");
これは、合格したテストを返します (FluentAssertions を使用)。
ただし、2 行目の GetCustomAttribute() へのメソッド呼び出しを次のように取得したいと思います。
var actual = something.GetCustomAttribute<StringLengthAttribute>(x => x.SomePublicString);
これは可能ですか?何か不足していますか?多分私はカフェインのクラッシュにいます。:(