当单元测试时嘲笑Newtonsoft.Json

时间:2020-10-08 14:50:53

标签: c# unit-testing exception json.net nunit

我目前正在测试一个类,该类读取嵌入式json文件,反序列化并将其加载到我的DI容器中。这是代码的tl; dr,省略了错误处理:

InstallScriptInfos\foo_InstalledScriptInfo

我正在使用NUnit和Moq进行测试,并且对测试游戏还很陌生。我想知道测试<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04"> <Obj RefId="0"> <TN RefId="0"> <T>Microsoft.PowerShell.Commands.PSRepositoryItemInfo</T> <T>System.Management.Automation.PSCustomObject</T> <T>System.Object</T> </TN> <MS> <S N="Name">foo</S> <S N="Version">1.0</S> <S N="Type">Script</S> <S N="Description">lorem ipsum</S> <S N="Author">pattif@contoso.com</S> <Obj N="CompanyName" RefId="1"> <TN RefId="1"> <T>System.Management.Automation.PSCustomObject</T> <T>System.Object</T> </TN> </Obj> <Nil N="Copyright" /> <Ref N="PublishedDate" RefId="1" /> <Obj N="InstalledDate" RefId="2"> <DT>2020-10-08T09:28:45.542507-05:00</DT> <MS> <Obj N="DisplayHint" RefId="3"> <TN RefId="2"> <T>Microsoft.PowerShell.Commands.DisplayHintType</T> <T>System.Enum</T> <T>System.ValueType</T> <T>System.Object</T> </TN> <ToString>DateTime</ToString> <I32>2</I32> </Obj> </MS> </Obj> <Nil N="UpdatedDate" /> <Nil N="LicenseUri" /> <Nil N="ProjectUri" /> <Nil N="IconUri" /> <Obj N="Tags" RefId="4"> <TN RefId="3"> <T>System.Object[]</T> <T>System.Array</T> <T>System.Object</T> </TN> <LST> <S>PSScript</S> </LST> </Obj> <Obj N="Includes" RefId="5"> <TN RefId="4"> <T>System.Collections.Hashtable</T> <T>System.Object</T> </TN> <DCT> <En> <S N="Key">DscResource</S> <Obj N="Value" RefId="6"> <TNRef RefId="3" /> <LST /> </Obj> </En> <En> <S N="Key">Function</S> <Ref N="Value" RefId="6" /> </En> <En> <S N="Key">RoleCapability</S> <Ref N="Value" RefId="6" /> </En> <En> <S N="Key">Workflow</S> <Ref N="Value" RefId="6" /> </En> <En> <S N="Key">Command</S> <Ref N="Value" RefId="6" /> </En> <En> <S N="Key">Cmdlet</S> <Ref N="Value" RefId="6" /> </En> </DCT> </Obj> <Nil N="PowerShellGetFormatVersion" /> <Nil N="ReleaseNotes" /> <Obj N="Dependencies" RefId="7"> <TNRef RefId="3" /> <LST /> </Obj> <S N="RepositorySourceLocation">/Volumes/PowerShellRepository</S> <S N="Repository">MyRepository</S> <S N="PackageManagementProvider">NuGet</S> <Obj N="AdditionalMetadata" RefId="8"> <TNRef RefId="1" /> <MS> <S N="description">lorem ipsum</S> <S N="requireLicenseAcceptance">False</S> <S N="isLatestVersion">False</S> <S N="isAbsoluteLatestVersion">False</S> <S N="tags">PSScript</S> <S N="developmentDependency">False</S> <B N="IsPrerelease">false</B> </MS> </Obj> <S N="InstalledLocation">/Users/craig/.local/share/powershell/Scripts</S> </MS> </Obj> </Objs> 方法的最佳方法,我不得不为一些测试编写包装器,但是如果我必须在这里做的话,那绝对是毁灭性的。这是下载次数最多的NuGet软件包,可以肯定的是人们遇到了这个问题并拥有了不错的解决方案。我已经使用System.IO.Abstractions来测试文件访问代码,我希望private readonly IAssemblyManager _assemblyManager; private readonly IContainerRegistry _containerRegistry public void Load(string resourceName) { string json = _assemblyManager.LoadResource(resourceName); IConfiguration config = JsonConvert.DeserializeObject<Configuration>(json); _containerRegistry.RegisterInstance<IConfiguration>(config); } 会有类似的东西。

其他可能的解决方法是让我的组装经理进行反序列化:

JsonConvert

但是对于我的应用程序,我想使用Newtonsoft.Json来加载sql&json,我真的不希望它负责反序列化任何内容。而且我也将我的问题从一堂课转移到了另一堂课。

1 个答案:

答案 0 :(得分:2)

没有适用于Newtonsoft.JSON的官方依赖项注入程序包。要测试您的代码,除非您找到模拟静态方法的模拟框架,否则无法创建包装器。