C# 使用 Moq 从模拟存储库中删除项目
C# using Moq to delete items from a Mock Repository
我正在尝试使用 C# 中的 Moq 框架进行测试删除,我正在测试项目是否已删除。
在底部,如果我将 int count 设置为 events.Count,它 returns 3。太棒了!!
但是,如果我将它设置为 EventsMockDatabase.Count(),它 returns 5 尽管模拟已设置为 return events.Count.
谁能帮我解释一下为什么?
[Test]
public void DeleteDuplicateEventDetailsFromRows()
{
var event1 = new EventLogObj() { RecordId = 1, TableKey = "PERSON_CODE=1", Status = "S" };
var event2 = new EventLogObj() { RecordId = 2, TableKey = "PERSON_CODE=2", Status = "S" };
var event3 = new EventLogObj() { RecordId = 3, TableKey = "PERSON_CODE=3", Status = "S" };
var event4 = new EventLogObj() { RecordId = 4, TableKey = "PERSON_CODE=2", Status = "S" };
var event5 = new EventLogObj() { RecordId = 5, TableKey = "PERSON_CODE=1", Status = "S" };
var events = new List<EventLogObj>() { event1, event2, event3, event4, event5 };
var mockEventsRepository = new Mock<IEventRepository>();
mockEventsRepository.Setup(ev => ev.GetEvents())
.Returns(events);
mockEventsRepository.Setup(ev => ev.DeleteEvent(It.IsAny<decimal>()))
.Callback((decimal RecID) =>
{
events.RemoveAll(e => e.RecordId == RecID);
});
mockEventsRepository.Setup(ev => ev.Count())
.Returns(events.Count);
IEventRepository EventsMockDatabase = mockEventsRepository.Object;
var eventLogObjects = new List<EventLogObj>();
var duplicateEventLogObjects = new List<EventLogObj>();
foreach (EventLogObj elo in EventsMockDatabase.GetEvents())
{
var existing = eventLogObjects.Where(
e => e.TableKey.Equals(elo.TableKey)
).ToList();
if (existing.Count == 0)
{
eventLogObjects.Add(elo);
}
else
{
duplicateEventLogObjects.Add(elo);
}
}
Assert.AreEqual(2, duplicateEventLogObjects.Count);
foreach (EventLogObj e in duplicateEventLogObjects)
{
// delete by id
EventsMockDatabase.DeleteEvent(e.RecordId);
}
int count = events.Count; // EventsMockDatabase.Count(); // WHY!!!?
Assert.AreEqual(3, count);
}
当您 Setup
Mock 时返回的值被存储,所以在这个例子中,初始列表的大小 (5)。
您可以通过使用委托设置模拟来绕过它:
mockEventsRepository.Setup(ev => ev.Count())
.Returns(() => { return events.Count; });
顺便说一句,您确实知道您当前的测试不会测试任何生产代码,它只是测试您是否已将模型设置为模拟存储库?
我正在尝试使用 C# 中的 Moq 框架进行测试删除,我正在测试项目是否已删除。
在底部,如果我将 int count 设置为 events.Count,它 returns 3。太棒了!! 但是,如果我将它设置为 EventsMockDatabase.Count(),它 returns 5 尽管模拟已设置为 return events.Count.
谁能帮我解释一下为什么?
[Test]
public void DeleteDuplicateEventDetailsFromRows()
{
var event1 = new EventLogObj() { RecordId = 1, TableKey = "PERSON_CODE=1", Status = "S" };
var event2 = new EventLogObj() { RecordId = 2, TableKey = "PERSON_CODE=2", Status = "S" };
var event3 = new EventLogObj() { RecordId = 3, TableKey = "PERSON_CODE=3", Status = "S" };
var event4 = new EventLogObj() { RecordId = 4, TableKey = "PERSON_CODE=2", Status = "S" };
var event5 = new EventLogObj() { RecordId = 5, TableKey = "PERSON_CODE=1", Status = "S" };
var events = new List<EventLogObj>() { event1, event2, event3, event4, event5 };
var mockEventsRepository = new Mock<IEventRepository>();
mockEventsRepository.Setup(ev => ev.GetEvents())
.Returns(events);
mockEventsRepository.Setup(ev => ev.DeleteEvent(It.IsAny<decimal>()))
.Callback((decimal RecID) =>
{
events.RemoveAll(e => e.RecordId == RecID);
});
mockEventsRepository.Setup(ev => ev.Count())
.Returns(events.Count);
IEventRepository EventsMockDatabase = mockEventsRepository.Object;
var eventLogObjects = new List<EventLogObj>();
var duplicateEventLogObjects = new List<EventLogObj>();
foreach (EventLogObj elo in EventsMockDatabase.GetEvents())
{
var existing = eventLogObjects.Where(
e => e.TableKey.Equals(elo.TableKey)
).ToList();
if (existing.Count == 0)
{
eventLogObjects.Add(elo);
}
else
{
duplicateEventLogObjects.Add(elo);
}
}
Assert.AreEqual(2, duplicateEventLogObjects.Count);
foreach (EventLogObj e in duplicateEventLogObjects)
{
// delete by id
EventsMockDatabase.DeleteEvent(e.RecordId);
}
int count = events.Count; // EventsMockDatabase.Count(); // WHY!!!?
Assert.AreEqual(3, count);
}
当您 Setup
Mock 时返回的值被存储,所以在这个例子中,初始列表的大小 (5)。
您可以通过使用委托设置模拟来绕过它:
mockEventsRepository.Setup(ev => ev.Count())
.Returns(() => { return events.Count; });
顺便说一句,您确实知道您当前的测试不会测试任何生产代码,它只是测试您是否已将模型设置为模拟存储库?