【问题标题】:List of objects dissapears in the method i'm testing with Moq mocking and unittests in ASP.net我在 ASP.net 中使用 Moq 模拟和单元测试测试的方法中的对象列表消失
【发布时间】:2023-03-10 14:06:01
【问题描述】:

好的,我很难形成一个好的问题,所以请不要因为我在我的代码中试图做的事情是 moqing 一个列表,我在列表中得到 1 个对象。该对象由 moqed 数据库中的 .find 方法检索。但是它不返回值,因为在方法中数据以某种方式消失了,并且我的 Person 对象留下了 null 我将发布一些屏幕截图,希望能解释我要说的内容以及我正在使用的测试方法:

方法:

[TestMethod]
        public void TestDetails()
        {
            Person test = new Person();
            test.ID = 1;
            test.City = "Eindhoven Area, Netherlands.";
            test.Name = "Marijn van Donkelaar";
            test.LearntSkillsAndLevelOfSkills = "Java:7, C#:4, SQL:4, PLSQL:4, Software Documentation:4, Software Development:4, HTML:2, CSS:2, jQuery:1";
            test.ProfileImage = "/Images/hollemar.jpg";
            test.PhoneNr = "0612345678";
            test.SkillsToLearn = "ASP.net:2, JAVA:2";
            test.Email = "fraylight@gmail.com";
            Person test1 = new Person();
            test1.ID = 2;
            test1.City = "Eindhoven Area, Netherlands.";
            test1.Name = "Jan Pietjes";
            test1.LearntSkillsAndLevelOfSkills = "Java:7, C#:4, SQL:4, PLSQL:4, Software Documentation:4, Software Development:4, HTML:2, CSS:2, jQuery:1";
            test1.ProfileImage = "/Images/hollemar.jpg";
            test1.PhoneNr = "0612345678";
            test1.SkillsToLearn = "ASP.net:2, JAVA:2";
            test1.Email = "fraylight@gmail.com";
            Person test2 = new Person();
            test2.ID = 3;
            test2.City = "Eindhoven Area, Netherlands.";
            test2.Name = "Jasmine Test";
            test2.LearntSkillsAndLevelOfSkills = "Java:7, C#:4, SQL:4, PLSQL:4, Software Documentation:4, Software Development:4, HTML:2, CSS:2, jQuery:1";
            test2.ProfileImage = "/Images/hollemar.jpg";
            test2.PhoneNr = "0612345678";
            test2.SkillsToLearn = "ASP.net:2, JAVA:2";
            test2.Email = "fraylight@gmail.com";

            var data = new List<Person> { test, test1, test2 }.AsQueryable();

            var mockSet = new Mock<DbSet<Person>>();
            mockSet.As<IQueryable<Person>>().Setup(m => m.Provider).Returns(data.Provider);
            mockSet.As<IQueryable<Person>>().Setup(m => m.Expression).Returns(data.Expression);
            mockSet.As<IQueryable<Person>>().Setup(m => m.ElementType).Returns(data.ElementType);
            mockSet.As<IQueryable<Person>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator()); 

            var mockContext = new Mock<PersonDBContext>();

            mockContext.Setup(m => m.Persons).Returns(mockSet.Object);


            var service = new PersonController(mockContext.Object);

            ActionResult person = service.Details(1);


        }

这有什么特别的原因吗?因为我真的没有看到它。我想这可能是因为起订量数据只认为它必须被调用一次然后消失但我不知道......我确实检查了数据并看到给定的 ID (1) 添加到 1对象,它在传递的列表中也可见

提前致谢,
马林

【问题讨论】:

    标签: c# asp.net unit-testing moq entity-framework-6


    【解决方案1】:

    您在模拟对象中使用了一个IEnumerator。这意味着当您的代码通过枚举其中的项目时,它位于IEnumerator 的末尾,随后对枚举器的评估将产生 0 个结果(因为它位于末尾)。

    您应该能够通过在每次调用 GetEnumerator 时返回一个新的 IEnumerator 来解决此问题:

    mockSet.As<IQueryable<Person>>().Setup(m => m.GetEnumerator())
        .Returns(() => data.GetEnumerator()); 
    

    或者,重复使用相同的枚举器,但每次访问时重置它:

    var enumerator = data.GetEnumerator();
    
    mockSet.As<IQueryable<Person>>().Setup(m => m.GetEnumerator())
        .Returns(() =>
        {
            enumerator.Reset();
            return enumerator;
        });
    

    【讨论】:

    • 非常感谢它确实解决了我的问题,我可以列举多次但遗憾的是它仍然找不到对象:(
    • @Marijn:您是否尝试过模拟 Find 方法以使其返回您想要的人?
    • Find 方法是 Dbset 的问题,它位于框架的 dll 中,所以我无法访问它......我认为可能的唯一方法是因为我起订量主键他找不到
    • @Marijn:你应该可以写mockSet.Setup(s =&gt; s.Find(It.IsAny&lt;int&gt;()).Returns(test1)(假设你总是想为传入的任何整数返回test1人)
    • @Marijn:模拟对象的想法是,您可以完全控制它的工作方式,以便进行单元测试。因此,如果您正在测试 Details 操作,您将强制 .Find 在测试中返回您想要的特定内容。不过,您也可以提供自己的 .Find 实现,例如 mockSet.Setup(s =&gt; s.Find(It.IsAny&lt;int&gt;()).Returns(id =&gt; data.SingleOrDefault(item =&gt; item.ID == id));
    猜你喜欢
    • 2014-01-18
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多