C# 方法i';在ASP.net中使用Moq模拟和unittests进行m测试
好的,我很难形成一个好的qeustion,所以请不要因为我在代码中试图做的是一个列表而激怒我,我在列表中得到了一个对象。此对象由moqed数据库中的.find方法检索。但是,它不会返回值,因为在方法中,数据以某种方式显示,我的Person对象保留为null。我将发布一些屏幕截图,希望能够解释我试图说的内容以及我使用的测试方法: 方法:C# 方法i';在ASP.net中使用Moq模拟和unittests进行m测试,c#,asp.net,unit-testing,moq,entity-framework-6,C#,Asp.net,Unit Testing,Moq,Entity Framework 6,好的,我很难形成一个好的qeustion,所以请不要因为我在代码中试图做的是一个列表而激怒我,我在列表中得到了一个对象。此对象由moqed数据库中的.find方法检索。但是,它不会返回值,因为在方法中,数据以某种方式显示,我的Person对象保留为null。我将发布一些屏幕截图,希望能够解释我试图说的内容以及我使用的测试方法: 方法: [TestMethod] public void TestDetails() { Person test
[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);
}
[TestMethod]
public void TestDetails()
{
人员测试=新人员();
test.ID=1;
test.City=“荷兰埃因霍温地区”;
test.Name=“Marijn van Donkelaar”;
test.LearntSkillsAndLevelOfSkills=“Java:7,C#:4,SQL:4,PLSQL:4,软件文档:4,软件开发: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=新的Person();
test1.ID=2;
test1.City=“荷兰埃因霍温地区。”;
test1.Name=“Jan Pietjes”;
test1.learntskills和levelofskills=“Java:7,C#:4,SQL:4,PLSQL:4,软件文档:4,软件开发: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";
人员测试2=新人员();
test2.ID=3;
test2.City=“荷兰埃因霍温地区。”;
test2.Name=“茉莉花测试”;
test2.learntskills和levelofskills=“Java:7,C#:4,SQL:4,PLSQL:4,软件文档:4,软件开发: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=newlist{test,test1,test2}.AsQueryable();
var mockSet=new Mock();
mockSet.As().Setup(m=>m.Provider).返回(data.Provider);
mockSet.As().Setup(m=>m.Expression).Returns(data.Expression);
mockSet.As().Setup(m=>m.ElementType).Returns(data.ElementType);
mockSet.As().Setup(m=>m.GetEnumerator()).Returns(data.GetEnumerator());
var mockContext=new Mock();
Setup(m=>m.Persons).Returns(mockSet.Object);
var service=newpersoncontroller(mockContext.Object);
ActionResult人员=服务详细信息(1);
}
有什么特别的原因吗?因为我真的没看到。我想这可能是因为moq数据只需要调用一次,然后就出现了,但我不知道。。。我确实检查了数据,看到给定的ID(1)被添加到了1个对象中,并且它在传递的列表中也是可见的
提前感谢,Marijn您正在模拟对象中使用一个
IEnumerator
。这意味着,当您的代码对其中的项进行枚举时,它位于IEnumerator
的末尾,随后对枚举器的求值将产生0个结果(因为它位于末尾)
只要在每次调用GetEnumerator
时返回一个新的IEnumerator
,就可以解决此问题:
mockSet.As<IQueryable<Person>>().Setup(m => m.GetEnumerator())
.Returns(() => data.GetEnumerator());
mockSet.As().Setup(m=>m.GetEnumerator())
.Returns(()=>data.GetEnumerator());
或者,重复使用相同的枚举数,但每次访问时都将其重置:
var enumerator = data.GetEnumerator();
mockSet.As<IQueryable<Person>>().Setup(m => m.GetEnumerator())
.Returns(() =>
{
enumerator.Reset();
return enumerator;
});
var enumerator=data.GetEnumerator();
mockSet.As().Setup(m=>m.GetEnumerator())
.Returns(()=>
{
枚举数。重置();
返回枚举器;
});
您正在模拟对象中使用一个IEnumerator
。这意味着,当您的代码对其中的项进行枚举时,它位于IEnumerator
的末尾,随后对枚举器的求值将产生0个结果(因为它位于末尾)
只要在每次调用GetEnumerator
时返回一个新的IEnumerator
,就可以解决此问题:
mockSet.As<IQueryable<Person>>().Setup(m => m.GetEnumerator())
.Returns(() => data.GetEnumerator());
mockSet.As().Setup(m=>m.GetEnumerator())
.Returns(()=>data.GetEnumerator());
或者,重复使用相同的枚举数,但每次访问时都将其重置:
var enumerator = data.GetEnumerator();
mockSet.As<IQueryable<Person>>().Setup(m => m.GetEnumerator())
.Returns(() =>
{
enumerator.Reset();
return enumerator;
});
var enumerator=data.GetEnumerator();
mockSet.As().Setup(m=>m.GetEnumerator())
.Returns(()=>
{
枚举数。重置();
返回枚举器;
});
您正在模拟对象中使用一个IEnumerator
。这意味着,当您的代码对其中的项进行枚举时,它位于IEnumerator
的末尾,随后对枚举器的求值将产生0个结果(因为它位于末尾)
只要在每次调用GetEnumerator
时返回一个新的IEnumerator
,就可以解决此问题:
mockSet.As<IQueryable<Person>>().Setup(m => m.GetEnumerator())
.Returns(() => data.GetEnumerator());
mockSet.As().Setup(m=>m.GetEnumerator())
.Returns(()=>data.GetEnumerator());
或者,重复使用相同的枚举数,但每次访问时都将其重置:
var enumerator = data.GetEnumerator();
mockSet.As<IQueryable<Person>>().Setup(m => m.GetEnumerator())
.Returns(() =>
{
enumerator.Reset();
return enumerator;
});
var enumerator=data.GetEnumerator();
mockSet.As().Setup(m=>m.GetEnumerator())
.Returns(()=>
{
枚举数。重置();
返回枚举器;
});
您正在模拟对象中使用一个IEnumerator
。这意味着,当您的代码对其中的项进行枚举时,它位于IEnumerator
的末尾,随后对枚举器的求值将产生0个结果(因为它位于末尾)
您只需返回一个新的