我正在使用NJsonSchema来验证JSON输入。
我有一个小类,它接收ValidationError
对象的集合,并使用每个验证错误的内容创建更多用户友好的错误消息。
我希望能够为此类编写单元测试,但是遇到了一个问题。我类中的一个消息处理程序负责处理NotInEnumeration
错误,为此,它使用ValidationError内Enumeration
对象内的JsonSchema4
属性并创建格式正确的错误消息。
为此特定处理程序编写测试时,我发现以下内容是非法的:
JsonSchema4 enumSchema = new JsonSchema4();
enumSchema.Enumeration = new List<object>{ "A", "B", "C" };
这是因为Enumeration属性具有内部设置程序。
我需要能够设置验证错误的枚举,因为该对象需要传递给ValidationError的构造函数,然后由我的处理程序稍后将其读取,如下所示。
private string NotInEnumerationHandler(ValidationError error)
{
var userFriendlyErrorString = "Answer must be within range: ";
var enumString = "[" + string.Join<object>(", ", error.Schema.Enumeration) + "]";
userFriendlyErrorString += enumString;
return userFriendlyErrorString;
}
我无法使用moq来模拟JsonSchema4对象,因为moq不允许模拟非虚拟方法。
基本上,细节并不是很重要,但是我想知道是否有任何方法可以设置内部设置器,以便可以在类中测试该特定方法。
答案 0 :(得分:1)
JsonSchema4.Enumeration
是ICollection<Object>
。
因此,我不需要将Enumeration
的值设置为新的集合,只需将所需的项添加到现有项中即可。
答案 1 :(得分:0)
您可以使用反射进行设置,首先需要获取属性的属性信息,然后将值设置为您创建的实例。
var enumSchema = new JsonSchema4();
var propertyInfo = typeof(JsonSchema4).GetProperty("Enumeration", BindingFlags.Public | BindingFlags.Instance);
propertyInfo.SetValue(enumSchema, new List<object> { "A", "B", "C" });
这是您可以验证其工作方式的方法
Console.WriteLine(propertyInfo.GetValue(enumSchema, null));
您可以使用某种扩展方法在测试程序集中为您提供“枚举”属性。
答案 2 :(得分:0)
这不是一个完整的答案,我只是在评论中放了太多,而且格式不正确。 这是您的AssemblyInfo.cs外观的示例:
using System.Reflection;
using System.Runtime.CompilerServices;
[assembly: AssemblyTitle("Assembly.Fully.Qualified.Name")]
[assembly: AssemblyDescription("")]
#if DEBUG
[assembly: InternalsVisibleTo("Assembly.Fully.Qualified.Name")]
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
#endif
您需要两个属性DynamicProxyGenAssembly2
的底部,以使Moq能够看到内部结构。在这种情况下,您可能不需要使用“调试和释放”开关,而不必担心#if DEBUG
部分。