Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 测试从单元返回的对象的所有可能条件或状态是否正确?_Unit Testing - Fatal编程技术网

Unit testing 测试从单元返回的对象的所有可能条件或状态是否正确?

Unit testing 测试从单元返回的对象的所有可能条件或状态是否正确?,unit-testing,Unit Testing,想象一下对以下示例场景进行单元测试。假设我模拟了CustomerDAO,以便返回有效的客户和客户订单。测试这个场景相当容易。除非我测试布尔值,看客户是否有订单。在一些真实场景中,他们没有订单。那么,我是否需要在模拟DAO中添加一些条件,以返回一个没有订单的客户,然后对其进行测试?现在想象一下,它要复杂得多,有几个DTO片段可能包含不同的信息位,这取决于从数据库返回的实际结果。我需要测试所有这些条件吗 public class Manager { public CustomerDTO g

想象一下对以下示例场景进行单元测试。假设我模拟了CustomerDAO,以便返回有效的客户和客户订单。测试这个场景相当容易。除非我测试布尔值,看客户是否有订单。在一些真实场景中,他们没有订单。那么,我是否需要在模拟DAO中添加一些条件,以返回一个没有订单的客户,然后对其进行测试?现在想象一下,它要复杂得多,有几个DTO片段可能包含不同的信息位,这取决于从数据库返回的实际结果。我需要测试所有这些条件吗

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,并期望测试通过,但在下一行再次失败。将所有断言放在不同的测试中,并描述名称。

这是我采用的方法,效果非常好。谢谢