簡體   English   中英

在具有用於測試(C#)的內部設置器的類中設置屬性

[英]Setting a property within a class that has an internal setter for use in testing (C#)

我正在使用NJsonSchema來驗證JSON輸入。

我有一個小類,它接收ValidationError對象的集合,並使用每個驗證錯誤的內容創建更用戶友好的錯誤消息。

我希望能夠為此類編寫單元測試,但是遇到了一個問題。 我類中的消息處理程序之一負責處理NotInEnumeration錯誤,為此,它使用ValidationError內JsonSchema4對象內的Enumeration屬性並創建格式正確的錯誤消息。

為該特定處理程序編寫測試時,我發現以下內容是非法的:

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不允許模擬非虛擬方法。

從本質上講,細節並不是很重要,但是我想知道是否有任何方法可以設置內部設置器,以便可以在類中測試此特定方法。

JsonSchema4.Enumeration是一個ICollection<Object>

因此,我不需要將Enumeration的值設置為新的集合,只需將所需的項添加到現有項中即可。

您可以使用反射進行設置,首先需要獲取屬性的屬性信息,然后將值設置為創建的實例。

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

您可以使用某種擴展方法在測試程序集中為您提供“枚舉”屬性。

這不是一個完整的答案,我只是在評論中放了太多,而且格式不正確。 這是您的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能夠看到內部結構。 您可能不需要Debug和Release開關,在這種情況下,請不要擔心#if DEBUG部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM