模拟接口方法的接口对象

时间:2019-07-30 08:21:40

标签: c# unit-testing moq

我在嘲笑下面的接口方法。

 ismyTextFieldType: boolean;

  togglemyPasswordFieldType(){
    this.isTextFieldType = !this.isTextFieldType;
  }

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

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

现在如何设置CreateMessage以返回所需的特定对象。

_messageBus = new Mock<IMessageBus>();

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

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

基本上,我需要在致电

时返回上述行
  

CreateMessage

方法。我们怎样才能做到这一点? 注意:我可以通过创建一个实现JsonConvert.SerializeObject(obj); // where obj is an Object. 接口并添加所需功能的MockMessage类来实现。 但是我想知道是否可以在没有显式类定义的情况下做到这一点。

IMessage

IMessage

2 个答案:

答案 0 :(得分:1)

moq 支持LINQ to Mocks,如果只想设置退货,则很有用。

如何使用它?

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

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

如果您不想使用此功能,或者需要比使用流利的api更复杂的东西(moq处理内部对象):

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

答案 1 :(得分:0)

就像这样:

_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;
    });
相关问题