【问题标题】:Multiple setups for a mockset ASP.net only carries out 1 mock模拟集 ASP.net 的多个设置仅执行 1 个模拟
【发布时间】:2023-03-04 17:44:01
【问题描述】:

所以我的问题是我必须模拟两件事。一种是找到一个人的方法,另一种是它迭代的那些人的列表。但是它并没有得到两种设置,而只有 1 个。我尝试将它们按不同的顺序排列,每次只有前 1 个有效。

这是我的代码:

Person test = new Person()
            {
                City = "Eindhoven Area, Netherlands.",
                userid = 1,
                ID = 1,
                Email = "fraylight@gmail.com",
                ExtraInfo = "blabla",
                HobbyProjectICTRelated = "a",
                Hobbys = "",
                LearntSkillsAndLevelOfSkills = "Java:7, C#:4, Software Documentation:4, Software Development:4, HTML:2, CSS:2, jQuery:1",
                Name = "Marijn van Donkelaar",
                PhoneNr = "0612345678",
                ProfileImage = "/Images/hollemar.jpg",
                SkillsToLearn = "ASP.net:2, JAVA:3",
                Stand = "",
                Summary = "",
                YearsOfWorkExperience = 6,
                PeopleManagerApproved = true,
                PeopleManager = "Richard"
            };
            Person test1 = new Person()
            {
                City = "Eindhoven Area, Netherlands.",
                userid = 2,
                ID = 2,
                Email = "fraylight@gmail.com",
                ExtraInfo = "",
                HobbyProjectICTRelated = "a",
                Hobbys = "zwemmen",
                LearntSkillsAndLevelOfSkills = "Java:8, C#:4, Software Documentation:4, Software Development:4, HTML:2, CSS:2, jQuery:1",
                Name = "Richard Holleman",
                PhoneNr = "",
                ProfileImage = "/Images/hollemar.jpg",
                SkillsToLearn = "ASP.net:2, JAVA:2",
                Stand = "",
                Summary = "",
                YearsOfWorkExperience = 16,
                PeopleManagerApproved = true,
                PeopleManager = "Richard"
            };
            Person test2 = new Person()
            {
                City = "Eindhoven Area, Netherlands.",
                userid = 3,
                ID = 3,
                Email = "fraylight@gmail.com",
                ExtraInfo = "",
                HobbyProjectICTRelated = "",
                Hobbys = "zwemmen",
                LearntSkillsAndLevelOfSkills = "C#:4, SQL:4, PLSQL:4, HTML:2, CSS:2, jQuery:1",
                Name = "Jasmine Test",
                PhoneNr = "0612345678",
                ProfileImage = "/Images/hollemar.jpg",
                SkillsToLearn = "ASP.net:2, JAVA:1",
                Stand = "",
                Summary = "",
                YearsOfWorkExperience = 11,
                PeopleManagerApproved = true,
                PeopleManager = "Richard"
            };
            var data = new List<Person> { test, test1, test2 }.AsQueryable();

            var dbSetMock = new Mock<IDbSet<Person>>();
            dbSetMock.Setup(m => m.Provider).Returns(data.Provider);
            dbSetMock.Setup(m => m.Expression).Returns(data.Expression);
            dbSetMock.Setup(m => m.ElementType).Returns(data.ElementType);
            dbSetMock.Setup(m => m.GetEnumerator()).Returns(() => data.GetEnumerator());

            var mockContext = new Mock<PersonDBContext>();
            mockContext.Setup(x => x.Persons).Returns(dbSetMock.Object);
            mockContext.Setup(x => x.Persons.Find(1)).Returns(test);

            var service = new PersonController(mockContext.Object);

            var controllerContext = new Mock<ControllerContext>();
            controllerContext.Setup(t => t.HttpContext.Session["loggedinuser"]).Returns(10);

            service.ControllerContext = controllerContext.Object;

            ViewResult detailspageresultcorrect = (ViewResult) service.Details(10);

            Person resultpersoncorrect = (Person) detailspageresultcorrect.Model;

            Assert.IsTrue(resultpersoncorrect.Name.Equals(test.Name));

出错的部分是: var mockContext = new Mock();

【问题讨论】:

    标签: asp.net unit-testing moq


    【解决方案1】:

    您应该能够模拟指向 IDbSetFind 方法,而不是通过 Persons 属性。

    所以您的设置如下所示:

    var dbSetMock = new Mock<IDbSet<Person>>();
    dbSetMock.Setup(m => m.Provider).Returns(data.Provider);
    dbSetMock.Setup(m => m.Expression).Returns(data.Expression);
    dbSetMock.Setup(m => m.ElementType).Returns(data.ElementType);
    dbSetMock.Setup(m => m.GetEnumerator()).Returns(() => data.GetEnumerator());
    
    dbSetMock.Setup(m => m.Find(1)).Returns(test);
    
    var mockContext = new Mock<PersonDBContext>();
    mockContext.Setup(x => x.Persons).Returns(dbSetMock.Object);
    

    【讨论】:

    • 不,不可能......但那是因为 x 是一个 DbContext 类,并且在该类中你保持你的 DbSet 我正确吗?
    • find 方法是在 IDbContext<T> interface 上定义的,所以你应该在你的 dbSetMock 上模拟它
    • 是的,否则 Persons.Find 方法的设置会隐式覆盖您原来的 Persons 设置。
    • 啊好吧,有道理哈哈谢谢:) 还是新手:P
    猜你喜欢
    • 2010-12-26
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    相关资源
    最近更新 更多