我有一个操作层,可以获取注入其中的Entity Framework数据库上下文。我通过使用Moq模拟数据库上下文来编写操作层的单元测试,如here所述。模拟数据以JSON格式存储在文本文件中,这些文件是从真实数据库中的数据创建的,因为数据太复杂而无法从头开始构建。
除了一个小问题外,一切顺利。在测试一些查询函数时,我遇到了区分大小写的问题。当应用程序运行时,它会将LINQ查询转换为SQL;由于like %search value%
不区分大小写,因此搜索词的大小写并不重要。但是,由于模拟数据是从JSON加载而不是通过SQL,因此测试失败的时候他们不应该这样做。
例如,我有两个模拟记录,一个字段值为' Port Gamble A'另一个有PORT GAMBLE B'搜索' gamble'没有找到任何模拟记录,也没有找到' Gamble'只找到一个。
现在,我在反序列化之后只是在名称字段上调用.ToLower()
来解决这个问题,但是我想测试搜索和调用{{1}的子对象中有很多文本字段。每一个人都会感到痛苦。手动编辑JSON以减少一切情况甚至更糟。我也不想更改LINQ查询以在搜索词和数据库字段上调用.ToLower()
,因为仅仅针对单元测试更改查询似乎很愚蠢,并且它可能会产生一些性能影响。
有没有办法自定义序列化以强制所有字符串值小写?我找到了很多关于如何降低属性名称的例子,但没有找到实际值。
编辑:嗯,这很容易。对于那些对解决方案感兴趣的人:
字符串值的自定义JSON转换器:
.ToLower()
使用public class LowerCaseJsonConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(string);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteValue(value.ToString().ToLower());
}
}
:
LowerCaseJsonConverter
答案 0 :(得分:2)
我假设你正在使用Json.Net
,你只需要使用自定义序列化程序,你可以添加你想要的任何逻辑属性名称和值
http://blog.maskalik.com/asp-net/json-net-implement-custom-serialization/