如何模拟返回OneOf<IServiceA,IServiceB>的方法?使用最小起订量

How to mock a method returning OneOf<IServiceA, IServiceB>? Using Moq

提问人:Rahul 提问时间:11/1/2023 更新时间:11/1/2023 访问量:47

问:

在我的项目中,编写了一种服务解析器类的常用方法。其中公共方法返回 OneOf<IServiceA、IServiceB、IServiceC>。我无法嘲笑这种类行为。

private readonly IServiceA _serviceA;
private readonly IServiceB _serviceB;
private readonly IServiceC _serviceC;

public ProjectResolver(
    IServiceA serviceA,
    IServiceB serviceB,
    IServiceC serviceC
)
{
    _serviceA = serviceA;
    _serviceB = serviceB;
    _serviceC = serviceC;
}

...

public OneOf<IServiceA, IServiceB, IServiceC> GetServiceHandler(string Id)
{
    if (!_projectSettings.Projects.ContainsKey(Id))
        return new NotFound();

    return _projectSettings.Projects[Id] switch
    {
        "a" => (ServiceA)_serviceA,
        "b" => (ServiceB)_serviceB,
        "c" => (ServiceC)_serviceC,
        _ => throw new ArgumentOutOfRangeException(Id)
    };
}

我已经模拟了所有服务(IServiceA、IServiceB 和 IServiceC)和项目解析器类。在运行测试时,我遇到以下异常。

Exception while calling Path
System.InvalidCastException: Unable to cast object of type 'Castle.Proxies.IserviceA' to type 'ServiceA'.

我需要帮助来模拟这个 projectResolver 类。提前👍致谢

C# . NET 核心 最小起订量

评论

0赞 Guru Stron 11/1/2023
请提供一个完整的最小可重复示例。目前我没有看到 Mock 的任何用法。
1赞 stuartd 11/1/2023
github.com/mcintyre321/OneOf/issues/63

答:

1赞 Guru Stron 11/1/2023 #1

模拟与否 - 无论如何,您都不应该强制转换为显式服务实现。创建“手动”:OneOf

return _projectSettings.Projects[Id] switch
{
    "a" => OneOf<IServiceA, IServiceB, IServiceC>.FromT0(_serviceA),
    "b" => OneOf<IServiceA, IServiceB, IServiceC>.FromT1(_serviceB),
    "c" => OneOf<IServiceA, IServiceB, IServiceC>.FromT2(_serviceC),
    _ => throw new ArgumentOutOfRangeException(Id)
};

评论

0赞 Rahul 11/1/2023
非常感谢 Stron@Guru。这就是问题所在,我一直在寻找其他地方。谢谢 👍