在具有内部setter的类中设置属性以用于测试(C#)

问题描述 投票:0回答:3

我正在使用NJsonSchema来验证JSON输入。

我有一个小类,它采用ValidationError对象的集合,并使用每个验证错误的内容创建更多用户友好的错误消息。

我希望能够为这个类编写单元测试,但是我遇到了一个问题。我班级中的一个消息处理程序负责处理NotInEnumeration错误,为此它使用ValidationError中保存的Enumeration对象中的JsonSchema4属性,并创建格式良好的错误消息。

在为这个特定的处理程序编写测试时,我发现以下内容是非法的:

JsonSchema4 enumSchema = new JsonSchema4();
enumSchema.Enumeration = new List<object>{ "A", "B", "C" };

这是因为Enumeration属性具有内部setter。

我需要能够设置验证错误的枚举,因为对象需要传递给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不允许模拟非虚方法。

基本上细节并不重要,但我想知道是否有任何设置内部setter的方法,以便我可以在我的班级中测试这个特定的方法。

c# njsonschema
3个回答
1
投票

JsonSchema4.Enumeration是一个ICollection<Object>

因此,我不需要将Enumeration的值设置为新的集合,我可以将我想要的项目添加到现有的项目中。


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));

您可以使用一些扩展方法为您提供测试程序集中的“Enumeration”属性。


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部分。

© www.soinside.com 2019 - 2024. All rights reserved.