【问题标题】:Solve ambiguous call with Moq setup for method to first return and the second to throw exception使用 Moq 设置解决模棱两可的调用,方法首先返回,第二个抛出异常
【发布时间】:2022-11-14 12:37:40
【问题描述】:

尝试使用 Moq 模拟对该接口(其中的一部分)的调用...

Task<T> StoreAsync<T>(
    IAuthUser user,
    T model, 
    IDataModel relative = null,
    IDictionary<string, object> args = null)
    where T : class, IDataModel;

我想要一个成功通话的“设置”

mockModelService.Setup(s => s.StoreAsync(It.IsAny<IAuthUser>(), It.IsAny<PaymentModel>(), It.IsAny<IDataModel>(), It.IsAny<IDictionary<string, object>>()))
    .ReturnsAsync((IAuthUser u, PaymentModel m, IDataModel d, IDictionary<string, object> c) =>
    {
        m.Id++;
        return m;
    });

我的目标是为在指定模型类型时引发异常的覆盖进行“设置”

// Notably the DuplicatePaymentCheck implements a static implicit constructor that takes a PaymentModel as parameter
mockModelService.Setup(s => s.StoreAsync<DuplicatePaymentCheck>(
    It.IsAny<IAuthUser>(), It.IsAny<DuplicatePaymentCheck>(), null, null))
    .ThrowsAsync(
        new ValidationException(40003, "Invalid", "DUPLICATE!"));

但是,我的代码没有编译,因为我有一个不明确的调用。我怎样才能正确地嘲笑这个?

(顺便说一句,我检查了the similar Q&A,但看不到与这种情况的联系)

【问题讨论】:

    标签: c# moq


    【解决方案1】:

    我最好的猜测是

    It.IsAny<IDataModel>(), It.IsAny<IDictionary<string, object>>()
    

    也可以为空;因此,当两者都作为 null 传递时,Moq 将不知道要调用哪个设置。这是考虑到DuplicatePaymentCheck 继承自PaymentModel

    尝试

    It.Is<IDataModel>(x => x != null), It.Is<IDictionary<string, object>>(x => x!= null)
    

    在第一个设置中并检查它是否编译。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多