【问题标题】:Mocking Newtonsoft.Json When Unit Testing单元测试时模拟 Newtonsoft.Json
【发布时间】: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


【解决方案1】:

Newtonsoft.JSON 没有官方的依赖注入包。要测试您的代码,没有办法创建包装器,除非您找到一个模拟静态方法的模拟框架。

【讨论】:

    猜你喜欢
    • 2020-03-24
    • 1970-01-01
    • 2013-02-22
    • 2011-04-11
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多