moq mongodb InsertOneAsync方法

问题描述 投票:0回答:2

我正在使用具有.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
2个回答
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);

}

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


0
投票

@@ Nkosi非常感谢您的帮助。终于我找到了路。我缺少额外的最小定量参数It.IsAny<System.Threading.CancellationToken>(),以下是工作测试

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

        }
© www.soinside.com 2019 - 2024. All rights reserved.