Tag: tdd

最好检测exception并抛出它们或者只是让运行时抛出它们?

让我们说有这样的设置: public class MyClass { public void DoSomething(string Data) { //if (String.IsNullOrWhiteSpace(Data)) //throw new NullReferenceException(); //Do something with Data and let it throw?? } } public class EntryPointClass { public void DoIt(string Data) { var logicClass = new MyClass(); try { logicClass.DoSomething(Data); } catch(Exception ex) { } } } 在DoSomething中,我可以检测到问题并抛出exception。 在测试EntryPointClass时,我可以测试预期结果或测试catch中发生的事情。 为什么抛出exception而不是等待一个exception更好? 无论哪种方式,我们都抓住了它!

二维对象数组返回类型 – NSubstitute

我得到一个演员exception System.InvalidCastException:无法将类型为’System.Object []’的对象强制转换为’System.Object [,]’。 在Castle.Proxies.ITestProxy.Get2DArray()在TestTest.cs中的Scratch.TestFixture.Get2DArray():第17行 从下面: [TestFixture] public class TestFixture { [Test] public void Get2DArray() { Substitute.For().Get2DArray().Returns(new object[1,1]); } } public interface ITest { object[,] Get2DArray(); } 任何人都可以对此有所了解吗? 我认为这是一个NSubstitute错误?

如何测试抽象类的受保护抽象方法?

我一直在研究测试名为TabsActionFilter的抽象类的最佳方法。 我已经保证从TabsActionFilterinheritance的类将有一个名为GetCustomer的方法。 在实践中,这种设计似乎运作良好。 我遇到的一些问题是如何测试基类的OnActionExecuted方法。 此方法依赖于受保护的抽象 GetCustomer方法的实现。 我曾尝试使用Rhino Mocks嘲笑这个类,但似乎无法模仿GetCustomer假客户的回报。 显然,将方法翻转为公共将使模拟可用,但受保护感觉更合适的可访问性级别 。 暂时在我的测试类中,我添加了一个inheritance自TabsActionFilter的具体私有类,并返回一个伪造的Customer对象。 具体类是唯一的选择吗? 是否有一个简单的模拟机制,我错过了允许Rhino Mocks为GetCustomer提供回报? 作为一个注释, Anderson Imes在关于Moq的回答中讨论了他对此的看法,我可能会遗漏一些关键,但这似乎不适用于此。 需要测试的类 public abstract class TabsActionFilter : ActionFilterAttribute { public override void OnActionExecuted(ActionExecutedContext filterContext) { Customer customer = GetCustomer(filterContext); List tabItems = new List(); tabItems.Add(CreateTab(customer, “Summary”, “Details”, “Customer”, filterContext)); tabItems.Add(CreateTab(customer, “Computers”, “Index”, “Machine”, filterContext)); tabItems.Add(CreateTab(customer, “Accounts”, “AccountList”, “Customer”, filterContext)); […]

将TDD回溯应用到C#代码库的最佳选择

我有一个由5个C#库组成的现有框架,该框架自2006年以来使用得很好,并且是我大多数项目的主要代码库。 我公司希望出于软件质量的原因推出TDD; 通过许多教程和阅读理论,我了解TDD的好处。 时间不是无限的我需要为实际的方法制定计划。 据我所知,我看到的选项是: A)可以使用一个测试项目来重叠来自所有5个库组件的对象。 一系列高级测试可能是最初被视为非常大的软件库的起点。 B)5个库组件中的每一个的测试项目。 这些项目将在最低级别测试function,与其他库组件隔离。 C)由于代码被广泛认为有效,因此只需对错误修复或新function添加unit testing。 使用重现错误的步骤编写一个测试,该测试在包含错误的逻辑上失败。 然后重新计算代码,直到测试通过。 现在您可以确信错误已得到修复,并且以后也不会在循环中引入 无论选择哪个选项,都可能需要“Mocking”来替换外部依赖项,例如: 数据库 网络服务 配置文件 如果有人有任何更多的输入,这将是非常有帮助的。 我计划在Visual Studio 2010中使用Microsoft内置的MSTest。

unit testing接口存储库的目的是什么

我是一个unit testingICustomerRepository接口,用于检索Customer类型的对象。 作为一个unit testing我通过以这种方式测试ICustomerRepository获得了什么价值? 在什么条件下,下面的测试会失败? 对于这种性质的测试,建议我做的测试应该失败吗? 即当我知道我只在存储库中放置了5时,查找id 4 我可能遗漏了一些明显的东西,但似乎实现ICustomerRepository的类的集成测试将更有价值。 [TestClass] public class CustomerTests : TestClassBase { private Customer SetUpCustomerForRepository() { return new Customer() { CustId = 5, DifId = “55”, CustLookupName = “The Dude”, LoginList = new[] { new Login { LoginCustId = 5, LoginName = “tdude” }, new Login { LoginCustId = 5, LoginName […]

在写任何锁之前,我应该对multithreading问题进行unit testing吗?

我正在编写一个我知道需要锁的类,因为该类必须是线程安全的。 但是,因为我是测试驱动 – 开发我知道在为它创建测试之前我不能编写一行代码。 而且我发现很难做到,因为测试最终会变得非常复杂。 在这些情况下你通常做什么? 有什么工具可以帮助吗? 这个问题是.NET特定的 有人要求代码: public class StackQueue { private Stack stack = new Stack(); private Queue queue = new Queue(); public int Count { get { return this.queue.Count + this.stack.Count; } } public void Enqueue(WebRequestInfo requestInfo) { this.queue.Enqueue(requestInfo); } public void Push(WebRequestInfo requestInfo) { this.stack.Push(requestInfo); } private WebRequestInfo Next() { […]

是否有可unit testing的方法将文件上载到ASP.NET WebAPI?

我正在使用新的ASP.NET WebAPI的项目中工作。 我目前的任务是接受上传的文件。 到目前为止,我已经使用TDD来驱逐WebAPI代码,但我已经上传了一个墙。 我目前正在关注http://www.asp.net/web-api/overview/working-with-http/sending-html-form-data,-part-2上的建议,但似乎没有完全可以将其从unit testing中推出。 为了获取文件和表单数据,我必须使用MultipartFormDataStreamProvider ,这是不可能模拟和/或覆盖的。 如果没有放弃我的TDD方法,我该怎么办? 这是示例中的代码: public Task PostFormData() { // Check if the request contains multipart/form-data. if (!Request.Content.IsMimeMultipartContent()) { throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); } string root = HttpContext.Current.Server.MapPath(“~/App_Data”); var provider = new MultipartFormDataStreamProvider(root); // Read the form data and return an async task. var task = Request.Content.ReadAsMultipartAsync(provider). ContinueWith(t => { if […]

先模拟一个方法而不先嘲笑一个类

我正在使用moq4来模拟我的UnitTests中的东西。 我有一个类说TestClass ,其中一个名为TestMethod的方法是我想要测试的方法。 所以我的问题是我的TestMethod需要检查我的TestClass中的testlist 。 像这样:- public Class TestClass { public readonly ISomeService _someService; public bool TestProperty { get; private set; } public List testlist { get; private set; } Public TestClass(ISomeService someService) { _someService = someService; } public async Task TestMethod(string sd) { if(TestProperty) // here how can i control this property in UnitTest. […]

犀牛嘲笑部分模拟

我试图从一些现有的类测试逻辑。 由于它们非常复杂并且在生产中,因此不可能重新考虑目前的类别。 我想要做的是创建一个模拟对象并测试一个内部调用另一个非常难以模拟的方法的方法。 所以我想为次要方法调用设置一个行为。 但是当我设置方法的行为时,方法的代码被调用并失败。 我是否遗漏了某些东西,或者这是不可能在没有重新分类的情况下进行测试? 我已经尝试了所有不同的模拟类型(Strick,Stub,Dynamic,Partial等),但是当我尝试设置行为时,它们都会调用该方法。 using System; using MbUnit.Framework; using Rhino.Mocks; namespace MMBusinessObjects.Tests { [TestFixture] public class PartialMockExampleFixture { [Test] public void Simple_Partial_Mock_Test() { const string param = “anything”; //setup mocks MockRepository mocks = new MockRepository(); var mockTestClass = mocks.StrictMock(); //record beahviour *** actualy call into the real method stub *** Expect.Call(mockTestClass.MethodToMock(param)).Return(true); //never […]

如何将unit testing项目添加到现有MVC3应用程序(从空模板)

我从Empty模板创建了一个MVC3应用程序,因此我无法在解决方案中添加Visual Studio Unit测试项目。 我做了一些更改,添加了一些控制器,现在我想尝试TDD,所以我需要添加一个框架进行测试。 但是我看不出我能做到这一点。 我想在某种方式,我可以在解决方案资源管理器中创建我的测试项目,例如“website.Test”与一些基本的文件夹和文件。 我在这里看到了一些关于如何添加unit testing的问题,但那些是xUnit.net或NUnit,我想要原始的VS测试框架。 我正在使用Visual Studio 2010 Professional。 我也有兴趣知道其他人对第三方unit testing框架的看法,他们更好吗? 初学者怎么样?