C# 模拟接口方法的接口对象

C# 模拟接口方法的接口对象,c#,unit-testing,moq,C#,Unit Testing,Moq,我有下面的接口方法,我嘲笑 public interface IMessageBus : IDisposable { IMessage CreateMessage<T>(T content); } 基本上,当我调用 创建消息 方法。我们如何才能做到这一点? 注意:我可以创建一个MockMessage类来实现IMessage接口并添加所需的功能。 但是我想知道,如果没有明确的类定义,我们是否可以做到这一点。 信息 public interface IMessage : ID

我有下面的接口方法,我嘲笑

public interface IMessageBus : IDisposable
{
     IMessage CreateMessage<T>(T content);
}
基本上,当我调用

创建消息

方法。我们如何才能做到这一点? 注意:我可以创建一个
MockMessage
类来实现
IMessage
接口并添加所需的功能。 但是我想知道,如果没有明确的类定义,我们是否可以做到这一点。

信息

public interface IMessage : IDisposable
    {
        string Id { get; }
        string CorrelationId { get; set; }
        string MessageContentType { get; }
        TimeSpan? TimeToLive { get; set; }
        AcknowledgementStatus AcknowledgementStatus { get; }
        IDictionary<string, object> CustomHeaders { get; }
        byte[] RawContent { get; }
        void Abandon();
        Task AbandonAsync();
        void Acknowledge();
        Task AcknowledgeAsync();
        IMessage Clone();
        T GetContent<T>();
        T GetContent<T>(IBinarySerializer serializer);
        IDictionary<string, object> GetMessageHeaders();
    }
公共接口IMessage:IDisposable
{
字符串Id{get;}
字符串CorrelationId{get;set;}
字符串MessageContentType{get;}
TimeSpan?TimeToLive{get;set;}
AcknowlementStatus AcknowlementStatus{get;}
IDictionary自定义标头{get;}
字节[]RawContent{get;}
无效放弃();
任务放弃异步();
无效确认();
任务确认easync();
i消息克隆();
T GetContent();
T GetContent(IBinarySerializer序列化程序);
IDictionary GetMessageHeaders();
}
情况是这样的:

_messageBus.Setup(x => x.CreateMessage(It.IsAny<object>()))
    .Returns<object>(obj => 
    {
        var item = new Mock<IMessage>();
        // Setup properties/methods here
        item.Setup(i => i.Id).Returns(obj.Id);

        return item.Object;
    });
\u messageBus.Setup(x=>x.CreateMessage(It.IsAny()))
.Returns(obj=>
{
var item=new Mock();
//此处设置属性/方法
item.Setup(i=>i.Id).Returns(obj.Id);
返回项。对象;
});

moq
支持LINQ-to-mock,如果您只想设置返回,那么它很有用

你怎么能用它

实际上,您非常接近解决方案,您可以执行以下操作:

_messageBus
    .Setup(x => x.CreateMessage(It.IsAny<object>()))
    .Returns(Mock.Of<IMessage>(m => m.Id == "MyId" && m.CorrelationId == "MyCorrelationId"));

你真的很接近,你能分享
IMessage
界面吗?分享了这个界面。
public interface IMessage : IDisposable
    {
        string Id { get; }
        string CorrelationId { get; set; }
        string MessageContentType { get; }
        TimeSpan? TimeToLive { get; set; }
        AcknowledgementStatus AcknowledgementStatus { get; }
        IDictionary<string, object> CustomHeaders { get; }
        byte[] RawContent { get; }
        void Abandon();
        Task AbandonAsync();
        void Acknowledge();
        Task AcknowledgeAsync();
        IMessage Clone();
        T GetContent<T>();
        T GetContent<T>(IBinarySerializer serializer);
        IDictionary<string, object> GetMessageHeaders();
    }
_messageBus.Setup(x => x.CreateMessage(It.IsAny<object>()))
    .Returns<object>(obj => 
    {
        var item = new Mock<IMessage>();
        // Setup properties/methods here
        item.Setup(i => i.Id).Returns(obj.Id);

        return item.Object;
    });
_messageBus
    .Setup(x => x.CreateMessage(It.IsAny<object>()))
    .Returns(Mock.Of<IMessage>(m => m.Id == "MyId" && m.CorrelationId == "MyCorrelationId"));
_messageBus
    .Setup(x => x.CreateMessage(It.IsAny<object>()).Id).Returns("MyId");
_messageBus
    .Setup(x => x.CreateMessage(It.IsAny<object>()).CorrelationId).Returns("MyCorrelationId ");