模拟一个测试方法试图模拟一个方法在另一个方法中调用。publicvirtualboolhello(stringname,intage){stringlastName=GetLastName();}publicvirtualstringGetLastName(){return"xxx";}模拟名称=newMock();name.Setup(x=>x.GetLastName()).Returns("qqq");我希望GetLastName方法始终返回“qqq”。这应该有效,假设这些是完整的方法实现publicclassMyProgram{publicboolhello(stringname,intage){returnstring.Format("你好{0}",lastName);}publicvirtualstringGetLastName(){return"xxx";}}publicclassMyProgramTests{[TestMethod]publicvoidMyTest(){stringstringToReturn="qqq";模拟名称=newMock();名称.CallBase=true;name.Setup(x=>x.GetLastName()).Returns(stringToReturn);varresults=name.Object.hello(It.IsAny(),It.IsAny());stringexpected=string.Format("你好{0}",结果);Assert.AreEqual(预期,结果);我还没有完全听取您的评论:参数对Mock到底意味着什么?是的?对不起,我不太懂语法。澄清一下,模拟意味着当我在我的代码中放置一个断点时,断点应该跳过我正在模拟的方法。我对吗?Mock允许您模拟一个类型的T-T作为通用指标,也意味着几乎任何类。传统上,你会模拟一个接口,而不是一个真正的类,但在上面的例子中,我们模拟的是一个类。对于发布的示例单元测试,单元测试的目的是测试hello(string,int)。我们知道hello(string,int)依赖于另一个名为GetLastName()的类。GetLastName()的实现虽然重要,但对于单元测试hello(string,int)的范围来说并不重要。出于这个原因,我们模拟调用及其返回-以便测试hello(string,int)的功能,而不必担心其依赖项的实现。我用实际的类名包围了上面的内容,希望更明显地表明我们模拟了MyProgram类并提供了GetLastName()的新实现(模拟GetLastName()感谢您的回答。如果我想测试调用另一个调用另一个方法的方法呢?例如,如果方法hello调用另一个方法怎么办?同样的原则适用于构建单元测试时(假设它们是单元测试,而不是集成测试或其他任何东西,您总是希望专注于测试公共方法。单元测试和集成测试有什么区别?returnstring.Format("{0}Baz",DoStuff(someNumber).ToString());}publicvirtualintDoStuff(intsomeNumber){returnsomeNumber+1;}}如果我们是unittestingBar()我们不关心Baz(int)的实现,或者更糟的是,DoStuff(int)。请注意,我们不关心实现,我们关心它们的返回值。从Bar()的角度来看,唯一重要的是Baz(int)返回一个字符串。什么字符串?Bar()的单元测试无关紧要。Bar()示例测试:[TestMethod]publicvoidBar_ReturnsBazValueWithBarAppended{//排列字符串testBazReturn="test";模拟mock=newMock();mock.CallBase=true;mock.Setup(s=>s.Baz(It.IsAny()).Returns(testBazReturn);//Actvarresults=mock.Object.Bar();//AssertAssert.AreEqual(string.Format("{0}{1}",testBazReturn,"Bar"),results);mock.Verify(v=>v.Baz(It.IsAny()));//验证调用了Baz}注意上面,我们有actual实现并不重要,因为我们忽略了Baz(int)的实际实现,而DoStuff(int)甚至没有发挥作用。现在,如果我们想测试Baz(int),我们只需遵循相同的思路:[TestMethod]publicvoidBaz_ReturnsDoStuffValueWithBazAppended{//ArrangeinttestDoStuffReturn=1;模拟mock=newMock();mock.CallBase=true;mock.Setup(s=>s.DoStuff(It.IsAny()).Returns(testDoStuffReturn);//Actvarresults=mock.Object.Baz(5);//AssertAssert.AreEqual(string.Format("{0}{1}",results,"Baz"),results);//验证结果mock.Verify(v=>v.DoStuff(It.IsAny()));//验证调用了DoStuff}上面,因为我们正在对Baz(int)进行单元测试,所以我们不关心Bar(),我们在DoStuff(int)中唯一关心的是它返回一个值(但不是它如何获得该值。)最后是DoStuff(int):以上是C#学习教程:模拟一个测试方法共享的所有内容。如果对大家有用,需要详细了解C#学习教程,希望大家多多关注——[TestMethod]publicvoidDoStuff_ReturnsParameterPlusOne(){//ArrangeFoofoo=newFoo();整数传递=1;int预期=通过+1;//执行varresults=foo.DoStuff(passed);//断言Assert.AreEqual(expected,results);}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
