2015-05-14 31 views
8

我们是两个学生写我们的学士论文,我们开发了一个Windows应用程序,它应该能够帮助餐厅进行各种沟通过程。从根本上说,它应该能够呈现从客人发送给它的那一刻起的订单信息。如何在NUnit中编写集成测试?

我们在开发过程中忽略了测试,但现在决定编写单元测试。不过,我们发现我们现在可以写入系统的最适合的测试是集成测试,因为我们类中的所有方法都通过LINQ to SQL绑定到SQL存储过程。我们知道使用存根来伪造对数据库的依赖关系,但是当我们的数据库已经与所有函数一起实现时,我们认为它会给我们提供更多的价值来将几种方法作为一个集成测试一起测试。

如下面的代码所示,我们试图按照单元测试的指导方针进行,但这是编写集成测试的正确方法吗?

[Test] 
public void SendTotalOrder_SendAllItemsToProducer_OneSentOrder() 
{ 
    //Arrange 
    Order order = new Order(); 
    Guest guest = new Guest(1, order); 
    Producer producer = new Producer("Thomas", "Guldborg", "Beverage producer");    
    DataGridView dataGridView = new DataGridView { BindingContext = new BindingContext() }; 
    order.MenuItemId = 1; 
    order.Quantity = 1; 

    //Act 
    guest.AddItem(); 
    dataGridView.DataSource = guest.SendOrderOverview(); 
    guest.SendOrder(dataGridView); 
    dataGridView.DataSource = producer.OrderOverview(); 
    var guestTableOrder = producer.OrderOverview() 
     .Where(orders => orders.gtid == guest.GuestTableId) 
     .Select(producerOrder => producerOrder.gtid) 
     .Single(); 

    //Assert 
    Assert.That(guestTableOrder, Is.EqualTo(guest.GuestTableId)); 
} 

回答

13

是的,一般来说,这是如何编写单元测试/集成测试。你观察一些重要准则:

  • 鲜明法案安排断言步骤
  • 测试名称描述了这些步骤(也许它应该有类似“ShouldSendOneOrder”末,“应该”常用来形容Assert)。
  • 一个断言每个测试。

我想你也听从其他准则:

  • 测试是独立的:它们不改变持久化状态,这样他们就不会影响其他测试。
  • 测试现实用例:不要安排违反商业逻辑的星座,不要做不可能的行为。或者:模仿真实的应用程序。

但是,我也看到引起眉毛的事情。

  • 目前尚不清楚其作用你测试。我认为一些“行为”属于安排步骤。

  • producer.OrderOverview()这样的方法让我怀疑域对象执行数据库交互。如果是这样,这将违反持续性无知。我认为应该有一个提供此方法的服务(但请参见下文)。

  • 不清楚为什么dataGridView.DataSource = producer.OrderOverview();是测试所必需的。如果是这样,这只会加剧最严重的问题:

  • 业务逻辑和用户界面都纠结!

    • 法像guest.SendOrderOverview()producer.OrderOverview():为什么一个域对象知道如何目前它的内容?这是演示者(MVP)或控制器(MVC)或视图模型(MVVM)应该负责的事情。
    • 类似guest.SendOrder(dataGridView)的方法是邪恶。它将领域层与UI框架联系起来。这个固定的依赖关系已经足够邪恶了,但是当然你也需要这个方法中的网格视图的值。所以业务逻辑需要熟悉一些UI组件。这违反了告诉 - 不要问原则。 guest.SendOrder应该有简单的参数来告诉它如何完成它的任务,并且域不应该有任何参考任何 UI框架。

你真的应该解决后一点。使其成为您的目标,无需与DGV进行任何交互即可运行此测试。

+0

非常感谢您的彻底解答!这是高度赞赏!我现在已经实现了你建议的大部分要点。实际上,这是我第一次进行集成测试,因此在做什么和不该做什么时获得这种全面的解释非常有价值:-) –

1

如果你继续在类中绑定sql,你的测试不是一个大问题。

你可以使用这个方法的时候程序逻辑很简单,但是我建议你学习The Repository Pattern,因为逻辑变得更加复杂。

相关问题