如何解决如何验证从未使用泛型调用过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 举报,一经查实,本站将立刻删除。