【问题标题】:moq mongodb InsertOneAsync methodmoq mongodb InsertOneAsync 方法
【发布时间】:2019-02-11 11:57:55
【问题描述】:

我正在使用带有 .net 核心的 Mongodb 数据库。我只想最小起订量插入使用mongodbContext 的方法。这是我正在尝试做的,但它不起作用:

public void InsertEventAsync_Test()
{
    //Arrange
    var eventRepository = EventRepository();
    var pEvent = new PlanEvent
    {
        ID = "testEvent",
        WorkOrderID = "WorkOrderID",
        IsDeleted = false,
        IsActive = true,
        EquipmentID = "EquipmentID"
    };
    ////Act


    //mockEventContext.Setup(mr => mr.PlanEvent.InsertOne(It.IsAny<PlanEvent>(), It.IsAny<InsertOneOptions>()))
    mockEventContext.Setup(s => s.PlanEvent.InsertOneAsync(It.IsAny<PlanEvent>(), It.IsAny<InsertOneOptions>())).Returns("sdad");
    var result = eventRepository.InsertEventAsync(pEvent);
    ////Assert
    result.Should().NotBeNull();
}

以下是我需要起订量的方法:

public EventRepository(IFMPContext eventContext)
{
    _eventContext = eventContext;
}

public async Task<string> InsertEventAsync(Model.EventDataModel.PlanEvent eventobj)
{
    eventobj._id = ObjectId.GenerateNewId();
    eventobj.CreatedDateTime = DateTime.UtcNow.ToString();
    try
    {
        _eventContext.PlanEvent.InsertOne(eventobj);
        return eventobj.ID;
    }
    catch (Exception ex)
    {
        string x = ex.Message;
    }
    return "";
}

【问题讨论】:

    标签: mongodb unit-testing .net-core moq


    【解决方案1】:

    假设

    public class EventRepository {
        private readonly IFMPContext eventContext;
    
        public EventRepository(IFMPContext eventContext) {
            this.eventContext = eventContext;
        }
    
        public async Task<string> InsertEventAsync(Model.EventDataModel.PlanEvent eventobj) {
            eventobj._id = ObjectId.GenerateNewId();
            eventobj.CreatedDateTime = DateTime.UtcNow.ToString();
            try {
                await eventContext.PlanEvent.InsertOneAsync(eventobj);
                return eventobj.ID;
            } catch (Exception ex) {
                string x = ex.Message;
            }
            return "";
        }
    }
    

    您需要配置测试以支持被测方法的异步特性

    public async Task InsertEventAsync_Test()
    {
        //Arrange
        var expected = "testEvent";
        var pEvent = new PlanEvent {
            ID = expected,
            WorkOrderID = "WorkOrderID",
            IsDeleted = false,
            IsActive = true,
            EquipmentID = "EquipmentID"
        };
    
        var mockEventContext = new Mock<IFMPContext>();
        mockEventContext
            .Setup(_ => _.PlanEvent.InsertOneAsync(It.IsAny<PlanEvent>(), It.IsAny<InsertOneOptions>()))
            .ReturnsAsync(Task.FromResult((object)null));
    
        var eventRepository = new EventRepository(mockEventContext.Object);
    
        //Act
        var actual = await eventRepository.InsertEventAsync(pEvent);
    
        //Assert
        actual.Should().NotBeNull()
        actual.Should().Be(expected);
    
    }
    

    需要将测试方法定义更新为异步的,以允许等待被测方法。还需要以这样一种方式设置模拟依赖项,以允许异步流在调用时按预期继续。

    【讨论】:

      【解决方案2】:

      @Nkosi 非常感谢您的帮助。最后我找到了方法。我缺少额外的起订量参数It.IsAny&lt;System.Threading.CancellationToken&gt;() 下面是工作测试

          public void InsertEventAsync_Test()
              {
                  //Arrange
                  var eventRepository = EventRepository();
                  var pEvent = new PlanEvent
                  {
                      ID = "testEvent",
                      WorkOrderID = "WorkOrderID",
                      IsDeleted = false,
                      IsActive = true,
                      EquipmentID = "EquipmentID"
                  };
                  ////Act
      
                  mockEventContext.Setup(s => s.PlanEvent.InsertOne(It.IsAny<PlanEvent>(), It.IsAny<InsertOneOptions>(),It.IsAny<System.Threading.CancellationToken>()));
                  var result = eventRepository.InsertEventAsync(pEvent);
                  ////Assert
                  result.Should().NotBeNull();
                  Assert.AreEqual(pEvent.ID, result);
      
              }
      

      【讨论】:

        猜你喜欢
        • 2021-06-30
        • 1970-01-01
        • 2017-04-23
        • 2013-02-10
        • 1970-01-01
        • 1970-01-01
        • 2021-09-29
        • 2010-11-12
        • 2015-12-14
        相关资源
        最近更新 更多