首页 > 解决方案 > moq mongodb InsertOneAsync 方法

问题描述

我正在使用带有 .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 "";
}

标签: mongodbunit-testing.net-coremoq

解决方案


假设

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

}

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


推荐阅读