C#列挙型の値は、その定義にリストされている値だけに限定されるものではなく、その基本型の任意の値を格納できます。基本タイプが定義されていない場合、Int32
または単にint
使用されている場合。
[Required]
私は、いくつかの列挙型に0のすべての列挙型のデフォルト値ではなく値が割り当てられていることを確信する必要があるWCFサービスを開発しています。ここで正しい仕事をするかどうかを調べるために単体テストから始めます。
using System.ComponentModel.DataAnnotations;
using Xunit;
public enum MyEnum
{
// I always start from 1 in order to distinct first value from the default value
First = 1,
Second,
}
public class Entity
{
[Required]
public MyEnum EnumValue { get; set; }
}
public class EntityValidationTests
{
[Fact]
public void TestValidEnumValue()
{
Entity entity = new Entity { EnumValue = MyEnum.First };
Validator.ValidateObject(entity, new ValidationContext(entity, null, null));
}
[Fact]
public void TestInvalidEnumValue()
{
Entity entity = new Entity { EnumValue = (MyEnum)(-126) };
// -126 is stored in the entity.EnumValue property
Assert.Throws<ValidationException>(() =>
Validator.ValidateObject(entity, new ValidationContext(entity, null, null)));
}
}
そうではなく、2番目のテストは例外をスローしません。
私の質問は:提供された値がにあることを確認するためのバリデーター属性はありEnum.GetValues
ますか?
更新します。ユニットテストで行ったようにではなく、必ずValidateObject(Object, ValidationContext, Boolean)
最後のパラメータが等しいで使用してください。True
ValidateObject(Object, ValidationContext)