簡體   English   中英

C#使用Moq從Mock存儲庫中刪除項目

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

我正在嘗試使用C#中的Moq框架進行測試刪除,我正在測試項目是否被刪除。

在底部,如果我將int count設置為events.Count,則返回3. Brilliant !! 但是,如果我將它設置為EventsMockDatabase.Count(),它返回5,盡管模擬已設置為返回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; });

順便說一句,您確實知道您當前的測試不會測試任何生產代碼,它只是測試您是否已將模型設置為模擬存儲庫?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM