我目前正在测试一个类,该类读取嵌入式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,我真的不希望它负责反序列化任何内容。而且我也将我的问题从一堂课转移到了另一堂课。
答案 0 :(得分:2)
没有适用于Newtonsoft.JSON的官方依赖项注入程序包。要测试您的代码,除非您找到模拟静态方法的模拟框架,否则无法创建包装器。