单元测试时模拟 Newtonsoft.Json

Mocking Newtonsoft.Json When Unit Testing

我目前正在测试一个 class 读取嵌入式 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,我真的不希望它负责反序列化任何内容。我也刚刚将我的问题从一个 class 转移到另一个

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