Gul*_*g92 11 c# sql database integration-testing unit-testing
我们是两名学生撰写我们的学士论文,我们开发了一个Windows应用程序,它应该能够帮助餐厅进行各种沟通.从根本上说,它应该能够在客人发送订单的那一刻起提供有关订单的信息.
我们在开发过程中省略了测试,但现在决定编写单元测试.然而,我们发现我们现在可以写入系统的最合适的测试是集成测试,因为我们类中的所有方法都通过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));
}
Run Code Online (Sandbox Code Playgroud)
Ger*_*old 18
是的,一般来说,这是如何编写单元测试/集成测试.您遵守一些重要指导原则:
我假设你也遵守其他指导方针:
但是,我也看到引起人们注意的事情.
目前尚不清楚你测试的是哪种行为.我认为一些"行为"属于安排步骤.
像这样的方法producer.OrderOverview()让我怀疑域对象执行数据库交互.如果是这样,这将违反持久性无知.我认为应该有一种提供这种方法的服务(但见下文).
目前尚不清楚为什么dataGridView.DataSource = producer.OrderOverview();测试需要.如果是这样,这只会加剧最严重的一点:
业务逻辑和UI纠缠在一起!
guest.SendOrderOverview()和producer.OrderOverview()有异味:为什么一个域对象知道如何呈现它的内容?这是演示者(MVP)或控制器(MVC)或视图模型(MVVM)应该负责的事情.guest.SendOrder(dataGridView)是邪恶的.它将域层与UI框架联系起来.这个固定的依赖是很邪恶的,当然你也需要这个方法里面的网格视图中的值.因此,业务逻辑需要对某些UI组件有深入了解.这违反了告诉 - 不要求原则.guest.SendOrder应该有简单的参数来告诉它如何执行它的任务,域不应该对任何 UI框架有任何引用.你真的应该解决后一点.让您的目标是在不与DGV进行任何交互的情况下运行此测试.
| 归档时间: |
|
| 查看次数: |
9330 次 |
| 最近记录: |