Moq MongoDB UpdateOneAsync方法用于单元测试

时间:2019-02-11 17:47:36

标签: mongodb unit-testing .net-core

我想使用mongodbContext进行更新方法。这是我正在尝试执行的操作,但不起作用。如何传递UpdateResult返回类型.ReturnsAsync<UpdateResult>()。我对使用.net核心的Mongodb数据库单元测试非常陌生。

 public void UpdateEventAsync_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.UpdateOneAsync(It.IsAny<FilterDefinition<PlanEvent>>(), It.IsAny<UpdateDefinition<Model.EventDataModel.PlanEvent>>(), It.IsAny<UpdateOptions>(), It.IsAny<System.Threading.CancellationToken>())).ReturnsAsync<UpdateResult>();
            var result = eventRepository.UpdateEventAsync(pEvent);
            ////Assert
            result.Should().NotBeNull();
            Assert.AreEqual(true, result);

        }

下面是我要为其编写Moq测试的代码

   public async Task<bool> UpdateEventAsync(Model.EventDataModel.PlanEvent eventobj)
    {
        var filter = Builders<Model.EventDataModel.PlanEvent>.Filter.Where(f => f.ID == eventobj.ID);

        // TO Do: Use replace instead of update.
        var updatestatement = Builders<Model.EventDataModel.PlanEvent>.Update.Set(s => s.IsDeleted, eventobj.IsDeleted)
            .Set(s => s.EquipmentID, eventobj.EquipmentID)
            .Set(s => s.PlannedStartDateTime, eventobj.PlannedStartDateTime)
            .Set(s => s.PlannedEndDatetime, eventobj.PlannedEndDatetime)
            .Set(s => s.WorkOrderID, eventobj.WorkOrderID)
            .Set(s => s.ResourceID, eventobj.ResourceID)
            .Set(s => s.LastUpdatedBy, eventobj.LastUpdatedBy)
            .Set(s => s.EventComment, eventobj.EventComment)
            .Set(s => s.SiteID, eventobj.SiteID)
            .Set(s => s.LastUpdatedDateTime, DateTime.UtcNow.ToString());

        UpdateResult updateResult = await _eventContext.PlanEvent.UpdateOneAsync(filter, updatestatement);
        return updateResult != null && updateResult.IsAcknowledged && updateResult.ModifiedCount > 0;
    } 

1 个答案:

答案 0 :(得分:1)

创建实例或模拟UpdateResult并从设置中返回

public async Task UpdateEventAsync_Test() {

    //...omitted for brevity

    var mockUpdateResult = new Mock<UpdateResult>();
    //Set up the mocks behavior
    mockUpdateResult.Setup(_ => _.IsAcknowledged).Returns(true);
    mockUpdateResult.Setup(_ => _.ModifiedCount).Returns(1);

    mockEventContext
        .Setup(_ => _.PlanEvent.UpdateOneAsync(It.IsAny<FilterDefinition<PlanEvent>>(), It.IsAny<UpdateDefinition<Model.EventDataModel.PlanEvent>>(), It.IsAny<UpdateOptions>(), It.IsAny<System.Threading.CancellationToken>()))
        .ReturnsAsync(mockUpdateResult.Object);

    //Act
    var result = await eventRepository.UpdateEventAsync(pEvent);

    //Assert
    result.Should().Be(true);

}

还请注意,测试必须异步进行才能准确执行。