Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#使用Moq从模拟存储库中删除项目_C#_Unit Testing_Tdd - Fatal编程技术网

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

C#使用Moq从模拟存储库中删除项目,c#,unit-testing,tdd,C#,Unit Testing,Tdd,我正在尝试使用C#中的Moq框架进行测试删除,并测试是否删除了这些项 在底部,如果我将int count设置为events.count,它将返回3。明亮的 但是,如果我将其设置为EventsMockDatabase.Count(),它将返回5,尽管已将模拟设置为返回events.Count 谁能帮我解释一下原因吗 [Test] public void DeleteDuplicateEventDetailsFromRows() { var event1 =

我正在尝试使用C#中的Moq框架进行测试删除,并测试是否删除了这些项

在底部,如果我将int count设置为events.count,它将返回3。明亮的 但是,如果我将其设置为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);
    }
[测试]
public void DeleteDuplicateEventDetailsFromRows()删除重复事件详细信息
{
var event1=new EventLogObj(){RecordId=1,TableKey=“PERSON\u CODE=1”,Status=“S”};
var event2=new EventLogObj(){RecordId=2,TableKey=“PERSON\u CODE=2”,Status=“S”};
var event3=new EventLogObj(){RecordId=3,TableKey=“PERSON\u CODE=3”,Status=“S”};
var event4=new EventLogObj(){RecordId=4,TableKey=“PERSON\u CODE=2”,Status=“S”};
var event5=new EventLogObj(){RecordId=5,TableKey=“PERSON\u CODE=1”,Status=“S”};
var events=new List(){event1,event2,event3,event4,event5};
var mockEventsRepository=new Mock();
mockEventsRepository.Setup(ev=>ev.GetEvents())
.返回(事件);
mockEventsRepository.Setup(ev=>ev.DeleteEvent(It.IsAny()))
.回调((十进制RecID)=>
{
events.RemoveAll(e=>e.RecordId==RecID);
});
mockEventsRepository.Setup(ev=>ev.Count())
.Returns(events.Count);
IEventRepository EventsMockDatabase=mockEventsRepository.Object;
var eventLogObjects=新列表();
var duplicateEventLogoObjects=新列表();
foreach(EventsMockDatabase.GetEvents()中的EventLogObj elo)
{
var existing=eventLogObjects.Where(
e=>e.TableKey.Equals(elo.TableKey)
).ToList();
if(existing.Count==0)
{
eventLogObjects.Add(elo);
}
其他的
{
duplicateEventLogObjects.Add(elo);
}
}
AreEqual(2,duplicateEventLogObjects.Count);
foreach(重复的EventLogoObject中的EventLogoObject)
{
//按id删除
EventsMockDatabase.DeleteEvent(如RecordId);
}
int count=events.count;//EventsMockDatabase.count();//为什么!!!?
断言。等于(3,计数);
}

在设置模拟时存储返回的值,因此在本例中,初始列表的大小(5)

您可以通过使用代理设置模拟来绕过它:

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

顺便说一句,您知道您当前的测试不会测试任何生产代码,它只是测试您是否已将模型设置为模拟存储库?

Brilliant!这很有效。谢谢-是的,我知道它在生产中不起作用。这只是为了定义我打算为我的实时数据集采取的步骤。我认为@forsvarir在这里提出的观点值得重复:你应该重写这个测试,因为它目前只测试自身,而不是实际的代码。通常,当您使用fakes/stubs/mocks/wat时,无论您想使用模拟框架调用它,都不会提供实现(如示例中的事件列表)。相反,我通常会验证是否将正确的消息发送给模拟的协作者。因此,与其在测试中管理事件列表,不如检查delete event方法是否正确调用。如果这需要GetEvents返回一些东西,只需返回虚拟数据。好的,我使用TDD来验证我在处理实时数据时所采取的步骤是否有效,并且我真的很想了解模拟。因此@prgmtc您建议我检查delete方法是否正确调用。我要做的是返回一个数据源的计数,它在之后比以前少。我现在要做的就是把它翻译成代码!!!有什么提示/样本吗?@Ozzy我相信关键是你不需要用你的模拟来模拟真实的行为。重要的是,测试中的代码在模拟中调用
DeleteEvent
,并传递任何相关参数。看看像这样的事情