Unit testing 测试从单元返回的对象的所有可能条件或状态是否正确?
想象一下对以下示例场景进行单元测试。假设我模拟了CustomerDAO,以便返回有效的客户和客户订单。测试这个场景相当容易。除非我测试布尔值,看客户是否有订单。在一些真实场景中,他们没有订单。那么,我是否需要在模拟DAO中添加一些条件,以返回一个没有订单的客户,然后对其进行测试?现在想象一下,它要复杂得多,有几个DTO片段可能包含不同的信息位,这取决于从数据库返回的实际结果。我需要测试所有这些条件吗Unit testing 测试从单元返回的对象的所有可能条件或状态是否正确?,unit-testing,Unit Testing,想象一下对以下示例场景进行单元测试。假设我模拟了CustomerDAO,以便返回有效的客户和客户订单。测试这个场景相当容易。除非我测试布尔值,看客户是否有订单。在一些真实场景中,他们没有订单。那么,我是否需要在模拟DAO中添加一些条件,以返回一个没有订单的客户,然后对其进行测试?现在想象一下,它要复杂得多,有几个DTO片段可能包含不同的信息位,这取决于从数据库返回的实际结果。我需要测试所有这些条件吗 public class Manager { public CustomerDTO g
public class Manager {
public CustomerDTO getCustomerInformation() {
CustomerDAO customerDAO = new CustomerDAO();
CustomerDTO customerDTO = new CustomerDTO();
customerDTO.setCustomer(customerDAO.getCustomer(1));
customerDTO.setCustomerOrders(customerDAO.getCustomerOrders(1));
if (!customerDTO.getCustomerOrders.isEmpty()) {
customerDTO.setHasCustomerOrders(true);
}
return customerDTO;
}
}
简而言之,我认为是的,您应该测试当DAO返回各种东西时,DTO上存在期望的状态。否则,您如何能够确信DTO将是数据存储中数据的准确表示 您应该为每个测试创建一个包含测试所需数据的模拟DAO,或者为每个需要测试的状态创建一个模拟DAO 我可能会做如下测试:
CustomerHasOrders\u在返回订单时返回订单\u也返回订单
CustomerHasOrders\u当退货或退货时
GetCustomer\u当返回客户列表时
GetCustomerOrders\u当退货订单相同时
GetCustomerOrders\u当您没有订单时
然后测试对Dao的任何调用失败时会发生什么
在本例中,该标志在DTO中似乎是冗余的,因为它只是其他数据的不同表示形式。您可以将其实现为CustomerTo上的扩展方法,或setCustomerOrders中的某些逻辑。如果DTO是通过网络发送的,并且功能不一定存在,那么您可以排除该属性,客户端只需执行检查,查看是否存在与customerDTO.getCustomerOrders.isEmpty()相同的订单
您想测试Manager是否正在将客户及其相关数据转换为CustomerTo。所以,是的,你必须测试所有这些不同的场景。但不要在一次测试中完成所有测试。每次测试都应该结束,要么成功,要么失败。我的意思是:
// Don't do this
[Test]
public void Manager_Converts_Customer_to_CustomerDTO()
{
// mock setup
var dto = Manager.GetCustomer();
Assert.That(dto, Is.Not.Null);
Assert.That(dto.Firstname, Is.EqualTo("what has been setup in mock"));
Assert.That(dto.Orders.Count, Is.EqualTo(expected_set_in_mock));
Assert.That(dto.Orders[0].Product, Is.EqualTo(expected_set_in_mock_product));
}
因为当有一个错误和四个错误时,有一个测试失败。您修复了一个bug,并期望测试通过,但在下一行再次失败。将所有断言放在不同的测试中,并描述名称。这是我采用的方法,效果非常好。谢谢