提问人:Rahul 提问时间:11/1/2023 更新时间:11/1/2023 访问量:47
如何模拟返回OneOf<IServiceA,IServiceB>的方法?使用最小起订量
How to mock a method returning OneOf<IServiceA, IServiceB>? Using Moq
问:
在我的项目中,编写了一种服务解析器类的常用方法。其中公共方法返回 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 类。提前👍致谢
答:
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。这就是问题所在,我一直在寻找其他地方。谢谢 👍
评论