如何验证从未使用泛型调用过Moc <DbSet>

问题描述

在我的单元测试项目中,我试图编写一个方法来检查以确保没有对将更改上下文的方法进行任何调用。我对泛型还比较陌生,在编写此方法时遇到了麻烦。

我当前拥有并想要替换的代码片段。

[Theory]
[MemberData(nameof(BadDeleteData))]
public void DeleteEventWithoutPermission(User requestingUser,int deleteEventId)
{
        #region Setup Moc Data

        MoqContexts.MoqEventContext moqEventContext = new MoqContexts.MoqEventContext();
        Mock<EventContext> eventContextMock = moqEventContext.GetMoqEventContext();
        var _requestController = MoqSetup.GetMocController<EventController,Mock<EventContext>>(requestingUser.Username,eventContextMock);

        #endregion
        #region Act

        Task<ActionResult<bool>> responseTask = _requestController.DeleteEvent(deleteEventId);
        if (!responseTask.IsCompleted)
            responseTask.Wait();

        #endregion
        #region Assert
        eventContextMock.Verify(x => x.SaveChanges(),Times.Never);
        eventContextMock.Verify(x => x.Add(It.IsAny<Event>()),Times.Never);
        eventContextMock.Verify(x => x.Update(It.IsAny<Event>()),Times.Never);
        eventContextMock.Verify(x => x.AddRange(It.IsAny<List<Event>>()),Times.Never);
        eventContextMock.Verify(x => x.Updaterange(It.IsAny<List<Event>>()),Times.Never);
        eventContextMock.Verify(x => x.Remove(It.IsAny<Event>()),Times.Never);
        eventContextMock.Verify(x => x.RemoveRange(It.IsAny<List<Event>>()),Times.Never);

        eventContextMock.Verify(x => x.Events.Add(It.IsAny<Event>()),Times.Never);
        eventContextMock.Verify(x => x.Events.Update(It.IsAny<Event>()),Times.Never);
        eventContextMock.Verify(x => x.Events.AddRange(It.IsAny<List<Event>>()),Times.Never);
        eventContextMock.Verify(x => x.Events.Updaterange(It.IsAny<List<Event>>()),Times.Never);
        eventContextMock.Verify(x => x.Events.Remove(It.IsAny<Event>()),Times.Never);
        eventContextMock.Verify(x => x.Events.RemoveRange(It.IsAny<List<Event>>()),Times.Never);

        eventContextMock.Verify(x => x.Floors.Add(It.IsAny<Floor>()),Times.Never);
        eventContextMock.Verify(x => x.Floors.Update(It.IsAny<Floor>()),Times.Never);
        eventContextMock.Verify(x => x.Floors.AddRange(It.IsAny<List<Floor>>()),Times.Never);
        eventContextMock.Verify(x => x.Floors.Updaterange(It.IsAny<List<Floor>>()),Times.Never);
        eventContextMock.Verify(x => x.Floors.Remove(It.IsAny<Floor>()),Times.Never);
        eventContextMock.Verify(x => x.Floors.RemoveRange(It.IsAny<List<Floor>>()),Times.Never);

        ...

我希望将大多数重复的代码行替换为以下内容:(请注意,该方法中的代码正好在我遇到另一端问题之后无法使用。)

[Theory]
[MemberData(nameof(BadDeleteData))]
public void DeleteEventWithoutPermission(User requestingUser,eventContextMock);

        #endregion
        #region Act

        Task<ActionResult<bool>> responseTask = _requestController.DeleteEvent(deleteEventId);
        if (!responseTask.IsCompleted)
            responseTask.Wait();

        #endregion
        #region Assert
        VerifyNoContextChange<EventContext>(eventContextMock);

        ...

protected static void VerifyNoContextChange<T>(Mock<T> contextMock) where T : ContextBase<DbContextOptions<T>>
{
        contextMock.Verify(x => x.SaveChanges(),Times.Never);
        contextMock.Verify(x => x.Add(It.IsAny<TT>()),Times.Never);
        contextMock.Verify(x => x.Update(It.IsAny<TT>()),Times.Never);
        contextMock.Verify(x => x.AddRange(It.IsAny<List<TT>>()),Times.Never);
        contextMock.Verify(x => x.Updaterange(It.IsAny<List<TT>>()),Times.Never);
        contextMock.Verify(x => x.Remove(It.IsAny<TT>()),Times.Never);
        contextMock.Verify(x => x.RemoveRange(It.IsAny<List<TT>>()),Times.Never);

        PropertyInfo[] propInfosContextMock = contextMock.Object.GetType().GetProperties();
        foreach (PropertyInfo propInfo in propInfosContextMock)
        {
            if (propInfo.PropertyType.Name == typeof(DbSet<T>).Name)
            {
                contextMock.Verify(x => contextMock.Object.GetType().GetProperty(propInfo.Name).GetValue(x),Times.Never);
            }

        }
 }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)