“HelloWorld”——TDD方式?自从我接触到TDD以来,我一直在思考这个问题。构建“HelloWorld”应用程序的最佳方式是什么?这将使用测试驱动开发将“HelloWorld”打印到控制台。我的测试会是什么样子?什么课程?请求:没有关于什么是TDD的“维基百科”链接,我对TDD很熟悉。只是好奇如何解决这个问题。您需要将控制台隐藏在界面后面。(无论如何,这可能被认为有用)写一个测试[TestMethod]publicvoidHelloWorld_WritesHelloWorldToConsole(){//安排IConsoleconsoleMock=MockRepository.CreateMock();//控制台的原始注入Program.Console=consoleMock;//行为Program.HelloWorld();//断言consoleMock.AssertWasCalled(x=>x.WriteLine("HelloWorld"));}编写程序publicstaticclassProgram{publicstaticIConsoleConsole{get;放;}//执行“逻辑”的方法publicstaticvoidHelloWorld(){Console.WriteLine("HelloWorld");}//设置真实环境publicstaticvoidMain(){Console=newRealConsoleImplementation();你好世界();}}heavy构建更有用的东西;-)演讲者观点?(模型似乎不是必需的)View将是一个将输出通过管道传输到控制台的类(简单的一行方法)Presenter是调用view.ShowText("HelloWorld")的接口,您可以通过提供存根来测试它看法。为了提高效率,我只想编写该死的程序:)一个测试就足够了(在伪代码中):IViewview=Stub();期待(view.ShowText("HelloWorld"));Presenterp=newPresenter(view);p.Show();Assert.IsTrue(view.MethodsCalled);嗯...我还没有看到helloworld的TDD版本。但是,要查看类似TDD和可管理性的简单问题,可以查看EnterpriseFizzBu??zz(代码)。至少这将使您看到helloworld中可能的过度工程化程度。伪代码:在生产代码中,您使用提示而不是模拟。经验法则:一个非常有趣的问题。我不是TDD的忠实用户,但我会提出一些想法。我假设您正在测试的应用程序是这样的:publicstaticvoidMain(){Console.WriteLine("HelloWorld");现在,由于我想不出任何直接测试它的好方法,我将编写将输入任务分解为一个接口。公共接口IOutputWriter{voidWriteLine(stringline);}publicclassConsoleWriter:IOutputWriter{publicvoidWriteLine(stringline){Console.WriteLine(line);}}并像这样破坏应用程序publicstaticvoidMain(){IOutputWriterconsoleOut=newConsoleWriter();WriteHelloWorldToOutput(consoleOut);}publicstaticvoidWriteHelloWorldToOutput(IOutputWriteroutput){output.WriteLine("HelloWorld");现在您有了一个方法注入点,它允许您使用您选择的模拟框架来断言使用“HelloWorld”参数调用WriteLine方法。我没有解决的问题(我对输入感兴趣):如何测试ConsoleWriter类,我猜你还需要一些UI测试框架来实现这个,如果你有这个,那么整个问题都是...测试主要方法。为什么我觉得我通过将一行未经测试的代码更改为七行代码来实现一些东西,其中只有一行代码被实际测试过(尽管我认为覆盖率已经上升)假设你知道单元测试,并假设你知道tdd“红绿重构过程”(既然你说你熟悉TDD),我将快速解释典型的tdd思维过程。如果您想到一个特定的问题单元,您的TDD生活会更轻松,并且所有其他相关的事物都应该根据依赖关系来考虑。这是一个示例场景:-我希望我的程序在控制台上显示helloworld。思考过程:-“我想我的程序会开始运行,然后调用控制台程序将我的消息传递给它,然后我希望我的控制台程序将它显示在屏幕上”“所以我需要测试当我当我运行我的程序,它应该调用控制台程序""现在依赖项是什么?我知道控制台程序是其中之一。我不需要担心控制台如何将消息传递到屏幕(调用io设备、打印等)我只需要知道我的程序成功调用了控制台程序。我需要相信控制台程序可以工作,如果它没有工作,那么在这一点上测试并确保它工作不是我的责任。我要测试的责任是我的程序在启动时调用控制台程序。”“可是我什至不知道到底该调用哪个控制台程序。我知道System.console.Writeline(具体实现),但由于需求的变化,这可能会在未来发生变化,那么我该怎么办?“好吧,我将依赖接口(或抽象)而不是具体实现,然后我可以创建一个虚拟控制台来实现我可以测试的接口”publicinterfaceIconsole{voidWriteToConsole(stringmsg);}publicclassFakeConsole:Iconsole{publicboolIsCalled=false;publicvoidWriteToConsole(stringmsg){IsCalled=true;如果控制台程序被调用Ok,我已经更改了IsCalled成员的“状态”,我知道这听起来像是一个漫长的思考过程,但确实有回报。Tdd迫使你在编码之前思考,然后在你思考之前编码。在一天结束时,您可能想出这样的东西来调用您的程序:varconsole=newFakeConsole();console.IsCalled=false;my_programprogram=newmy_program(控制台);程序.问候语();我将控制台传递给my_program,以便my_program将使用控制台将我们的消息写入屏幕。我的my_program可能看起来像这样:publicclassmy_program{Iconsole_consol;publicmy_program(Iconsoleconsol){if(consol!=null)_consol=consol;}publicvoidgreet(){_consol.WriteToConsole("Helloworld");}}最后的单元测试将是:-[TestMethod]publicvoidmyProgramShouldDisplayHelloWorldToTheConsole(){//arrangevarconsole=newFakeConsole();console.IsCalled=false;my_programprogram=newmy_program(控制台);//动作程序。迎接();//assertAssert.AreEqual(true,console.IsCalled,"consolewasnotcalledtodisplaythegreeting");在java中,您可以捕获(“重定向”)System.out流并读取其内容。我确信可以在C#中执行相同的操作。这只是Java中的几行代码,所以我相信在C#中不会更多我真的不得不反对这个问题!所有的方法都有它的用武之地,TDD在很多地方都很好。但是UI是我真正退出TDD的第一个地方。在我看来,这是采用MVC设计模式的最佳理由之一:以编程方式测试模型和控制器;目视检查你的观点。您所说的是对“HelloWorld”数据进行硬编码并测试它是否已发送到控制台。要使用相同的源语言进行此测试,您几乎必须拥有虚拟控制台对象,这是唯一可以做任何事情的对象。或者,您可以用bash编写测试脚本:echo`javaHelloWorldProgram`|grep-c"^HelloWorld$"添加到JUnit测试套件有点困难,但有些事情告诉我这绝不是计划....我同意DavidBerger的观点;分离接口,测试模型。在这种情况下,“模型”似乎是一个返回“Hello,world!”的简单类。测试看起来像这样(在Java中):Greetergreeter=newGreeter();assertEquals("HelloWorld!",greeter.greet());18/tdd_hello_world/创建了介绍HelloWorldTDD风格的文章。我的猜测是:以上是C#学习教程:《HelloWorld》——TDD之道?所有分享的内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——usingNUnit.Framework;使用系统诊断;[TestFixture]publicclassMyTestClass{[Test]publicvoidSayHello(){stringgreet="HelloWorld!";Debug.WriteLine(问候);Assert.AreEqual("HelloWorld!",greet);}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理会员删除。如需转载请注明出处:
