【发布时间】:2021-01-23 15:42:41
【问题描述】:
我目前正在测试一个读取嵌入式 json 文件、反序列化并将其加载到我的 DI 容器中的类。这是代码的 tl;dr,省略了错误处理:
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);
}
我正在使用 NUnit 和 Moq 进行测试,而且我对测试游戏还很陌生。我想知道测试JsonConvert 方法的最佳方法,我不得不为我的一些测试编写包装器,但如果我不得不在这里做的话绝对会被摧毁。这是下载次数最多的 NuGet 包,肯定有人遇到过这个问题并有一个不错的解决方案。我使用System.IO.Abstractions 来测试我的文件访问代码,我预计Newtonsoft.Json 会有类似的东西。
其他潜在的解决方法可能是让我的程序集经理进行反序列化:
public interface IAssemblyManager
{
T LoadResource<T>(string resourceName);
}
但是对于我的应用程序,我想使用IAssemblyManager 来加载 sql 和 json,我真的不希望它负责反序列化任何东西。而且我还刚刚将我的问题从一个班级转移到另一个班级。
【问题讨论】:
-
你说你想测试 JsonConvert 但你想说你想在不依赖 JsonConvert 的情况下进行测试,对吗?阿卡嘲笑它。这是一个很好的做法,但我个人从来不需要嘲笑它。即使在您的示例中,我也不需要模拟 JsonConvert。
-
我并不特别在意测试
JsonConvert.Deserialize方法,但我有兴趣嘲笑它的行为。就我而言,它可以返回一个值、返回 null 或抛出异常,我想在我的测试中解决这些场景。在对象注册到容器后,我有一些代码来验证它是否已注册,我真的不想在我的测试中遵守Newtonsoft.Json的规则,我不想把它当作具体的: /
标签: c# unit-testing exception json.net nunit