尝试针对 FluentValidation 进行 TDD 并寻找代表美国州列表的正确方法。
例如,我有一个“地址”对象。
我想编写一个测试(和 FluentValidation 规则),如果地址不在美国州列表中,则声明该地址无效。
这是一个有限的列表,只包括美国的 50 个州,所以我认为它应该是恒定的,而不是在数据库中表示。
我想知道的是,存储和验证/测试这个最有效的方法是什么?一个枚举、一个数组、一个列表对象,什么?
尝试针对 FluentValidation 进行 TDD 并寻找代表美国州列表的正确方法。
例如,我有一个“地址”对象。
我想编写一个测试(和 FluentValidation 规则),如果地址不在美国州列表中,则声明该地址无效。
这是一个有限的列表,只包括美国的 50 个州,所以我认为它应该是恒定的,而不是在数据库中表示。
我想知道的是,存储和验证/测试这个最有效的方法是什么?一个枚举、一个数组、一个列表对象,什么?
使用static readonly
数组或 HashSet。
一个州可以用它的全名或缩写来表示。你要检查两者吗?此外,可以通过邮政编码验证状态(我不确定您是否要这样做)。
您可能有一个静态只读单数组或包含全名和缩写的哈希集,如下所示:
public static readonly string[] listOfStates = new string[]
{
"New York",
"NY",
// rest of states & abbreviations here...
};
或者
public static readonly HashSet<string> listOfStates = new HashSet<string>
{
"New York",
"NY",
// rest of states & abbreviations here...
};
两者都支持Contains
语法:
// Queryable like this:
bool stateMatch = listOfStates.Contains(stringValue);
我会把它们保存在一个常量字符串数组中......
//Define the constant array
const String[] TheStates = new String[] { "Alabama", "Arizona", ... };
//fluentvalidation rule
RuleFor(address => address.State).Must(theState => TheStates.Contains(theState));
将它们保持在一个Enum
状态将需要在状态名称和整数值之间建立某种关联——这听起来并不那么有效。或者您必须使用ToString()
很多或为枚举中的每个项目构建一些自定义属性(我已经看到了一些这样的示例 - 但是您正在处理反射,这不是那么高效)。
List
只有当您需要每个州的一些额外数据(例如全名、缩写、录取日期等)时,我才会考虑使用。
尽可能使用最简单的格式。
希望这可以帮助。