【问题标题】:Mocking an Interface Object of an Interface Method模拟接口方法的接口对象
【发布时间】:2019-07-30 08:21:40
【问题描述】:

我有以下我正在模拟的接口方法。

public interface IMessageBus : IDisposable
{
     IMessage CreateMessage<T>(T content);
}

现在我可以为我的单元测试模拟这个界面,如下所示。

_messageBus = new Mock<IMessageBus>();

现在如何设置 CreateMessage 以返回我想要的特定对象。

_messageBus.Setup(x => x.CreateMessage(It.IsAny<object>())).Returns(Mock.Of<IMessage>());

这只是返回一个空对象但我需要返回一个有效对象。像这样的

JsonConvert.SerializeObject(obj); // where obj is an Object.

基本上我需要在调用时返回上面的行

创建消息

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

我的消息

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界面吗?
  • 共享界面。

标签: c# unit-testing moq


【解决方案1】:

moq 支持 LINQ to Mocks,如果您只想设置返回值,这很有用。

你如何使用它?

实际上你真的很接近解决方案,你可以这样做:

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

如果你不想使用这个功能,或者你需要比使用 fluent api 更复杂的东西(moq 负责内部对象):

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

【讨论】:

    【解决方案2】:

    应该是这样的:

    _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;
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多