【问题标题】:moq a method with a template parametermoq 带有模板参数的方法
【发布时间】:2015-12-02 14:41:24
【问题描述】:

我正在创建一个单元测试,使用 moq.Mock 类来模拟这种情况。 我想用模板参数模拟一个方法,以便我可以检查发送给它的内容。

mockGateway = new Mock<GatewayClass>();

//this one works
mockGateway.Setup(e => e.Log(It.IsAny<LogLevel>(), It.IsAny<Exception>(), It.IsAny<string>(), It.IsAny<object[]>()))
            .Callback<LogLevelClass, Exception, string,object[]>(LogCheck);

//this one doesnt work
mockGateway.Setup(e => e.Send<RequestClass>(It.IsAny<RequestClass>()))
            .Callback<RequestClass>(SendCheck);

安装程序(例如 .. 给出“不明确的调用”编译错误。

RequestClass 给出一个编译错误“类型必须可转换为 IMessage 才能在通用发送中用作参数 TMessage, 但是 RequestClass 实现了 IMessage,但是查看时的元数据没有显示这一点。 因为我正在使用与它定义的解决方案不同的解决方案进行测试。

private void LogCheck(LogLevel level, Exception ex, string str, object[] paramObjs)
{
    //do something...
}

private void SendCheck<TMessage>(TMessage message)
    where TMessage : class, IMessage,IRequestMessage, new()
{
    //do something...
}

public class RequestClass: IMessage, IRequestMessage
{
    public RequestClass();
    ...other methods..
}

public class GatewayClass : IGateway
{
    public ISynchronousRequestResult<ResultResponse> Send<TMessage>(TMessage message)
        where TMessage : class, IMessage,IRequestMessage, new()
    {
        return service.Send<ResultResponse,TMessage>(message);
    }
}

谁能告诉我应该/可以怎么做?

【问题讨论】:

  • 您能否将RequestClass 的定义添加到您的问题中?
  • 我明天可以添加,但它实现了 IMessage。它有一个与 LogCheck 匹配的 Log 方法 它有一个与 SendCheck 参数匹配的 send 方法,但返回不是 void。你还想知道什么?
  • 我只想要整个画面。您还说错误消息提到了SendAndListen;您也可以添加该方法的签名吗?
  • 抱歉 send 和 sendandlisten 是同一个方法,我只是不想泄露我正在处理的实际代码
  • 已更新以包含所有类和详细信息。

标签: c# .net unit-testing nunit moq


【解决方案1】:

检查多个 IMessage。

我发现我引用了一个不是我自己的 microsoft IMessage。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 2014-09-08
    • 2011-05-28
    • 2016-04-16
    • 2021-08-25
    相关资源
    最近更新 更多