2015-06-23 35 views
3

我想做一个测试删除在C#中使用Moq框架,我测试项目被删除。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); 
    } 

回答

2

返回的值存储,当你Setup素,所以在这种情况下,初始列表的大小(5)。

你可以避开它通过而不是设置了模拟与委托:

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

顺便说一句,你知道,你目前的测试不会测试任何生产代码,它只是,如果你测试已经设置你的模拟模拟库?

+0

太棒了!这样可行。谢谢 - 是的,我知道它不会在生产上工作。这只是为了定义我打算为我的实时数据集采取的步骤。 – ozzy432836

+1

我认为@forsvarir在这里重申了一点:你应该重写这个测试,因为它目前只是测试自己而不是实际的代码。通常,当你使用虚拟框架调用虚假/存根/嘲笑/ watever时,你不提供一个实现(如你的例子中的事件列表)。相反,我通常会验证是否将正确的消息发送给模拟的合作者。因此,不要管理测试中的事件列表,只需检查是否正确调用了删除事件方法。如果这需要GetEvents返回某些内容,则只需返回虚拟数据。 – prgmtc

+0

好吧,我正在使用TDD来验证在处理实时数据时所采取的步骤,并且真正想了解模拟。所以@prgmtc你建议我可以检查正确调用删除方法。我会这样做的方式是返回数据源的数量比以前少。我所要做的就是把它转换成代码吧!任何提示/样本? – ozzy432836