简体   繁体   English

C#使用Moq从Mock存储库中删除项目

[英]C# using Moq to delete items from a Mock Repository

I am trying to do a test delete using the Moq framework in C# and I am testing that the items were removed. 我正在尝试使用C#中的Moq框架进行测试删除,我正在测试项目是否被删除。

At the bottom, if I set int count to be events.Count, it returns 3. Brilliant!! 在底部,如果我将int count设置为events.Count,则返回3. Brilliant !! However if i set it to be EventsMockDatabase.Count(), it returns 5 despite the fact that the mock has been setup to return events.Count. 但是,如果我将它设置为EventsMockDatabase.Count(),它返回5,尽管模拟已设置为返回events.Count。

Can anyone help me explain why? 任何人都可以帮我解释原因吗?

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

The value that is returned is stored when you Setup the Mock, so in this instance, the size of the initial list (5). Setup Mock时会返回返回的值,因此在本例中,是初始列表的大小(5)。

You can get round it by instead setting up the mock with a delegate: 您可以通过使用委托设置模拟来绕过它:

mockEventsRepository.Setup(ev => ev.Count())
    .Returns(() => { return events.Count; });

As an aside, you do know that your current test wouldn't test any production code, it's simply testing if you've set your mock up to simulate a repository? 顺便说一句,您确实知道您当前的测试不会测试任何生产代码,它只是测试您是否已将模型设置为模拟存储库?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM