代码之家  ›  专栏  ›  技术社区  ›  tom

基于测试目的的模型重构

  •  2
  • tom  · 技术社区  · 14 年前

    class Customer
    {
        public function save(array $data, $id = NULL)
        {
            // create or update
            if (empty($id)) {
                $customer = new \Entities\Customer();
            } else {
                $customer = $this->findById((int) $id);
            }
    
            $birthday = new DateTime();
            list($day, $month, $year) = explode("/", $data['birthday']);
            $birthday->setDate($year, $month, $day);
    
            $customer->setFirstName($data['firstName']);
            $customer->setLastName($data['lastName']);
            $customer->setCompany($data['company']);
            $languageModel = new Application_Model_Language();
            $customer->setLanguage($languageModel->findById($data['language']));
            $resellerShopModel = new Application_Model_ResellerShop();
            $customer->setResellerShop($resellerShopModel->findById($data['resellerShop']));
            $customer->setEmail($data['email']);
            $customer->setPhone($data['phone']);
            $customer->setGender($data['gender']);
            $customer->setBirthday($birthday);
            $customer->setType($data['type']);
            $customerSectorModel = new Application_Model_CustomerSector();
            $customer->setSector($customerSectorModel->findById($data['sector']));
            $customerReferenceModel = new Application_Model_CustomerReference();
            $customer->setReference($customerReferenceModel->findById($data['reference']));
            if (isset($data['password'])) {
                $customer->setPassword($this->_hashPassword($data['password']));
            }
    
            return $customer;
        }
    }
    
    2 回复  |  直到 14 年前
        1
  •  2
  •   Community Ian Goodfellow    4 年前

    1. 创建 mock library

    2. 将外部类的一组默认参数添加到函数声明中。最后,您的新函数声明如下所示 public function save(array $data, $id = NULL, $newCustomer=\Entities\Customer(), $newLangModel = Application_Model_Language, ...) $customer = new $newCustomer() . 在测试代码中,可以用一个模拟类重写每个依赖的类。

    3. 不是为每个类添加一个参数,而是创建两个 factories :一个创建当前对象,另一个创建模拟对象。在函数内部,您只能从工厂请求新对象。

        2
  •  0
  •   jsuggs    14 年前

    使用现在的代码,我看到需要两个不同的测试。

    1) 测试\Entities\Customer类。

    验证每个getter和setter是否正常工作,或者至少验证任何一个支持业务逻辑的getter和setter是否正常工作。例如,如果您设置了ResellerShop,那么如果您获得了一个正确/有效的ResellerShow对象。

    2) 测试(Factory\Repository)类。

    确保显示的类根据传入数组的数据正确创建(或失败)。例如,如果没有传入必需的字段,它应该失败,并且它不应该返回customer实体对象。