【问题标题】:How to decouple my data layer better and restrict the scope of my unit tests?如何更好地解耦我的数据层并限制我的单元测试的范围?
【发布时间】:2011-09-07 11:56:53
【问题描述】:

我开始掌握单元测试并学习如何将我的代码分解为可测试的部分,但我不清楚的一件事是如何编写我的“更高级别”代码,例如我的控制器操作,因此测试控制器不需要通过实际的数据层(在我的测试套件的其他地方独立测试)。

例如 - 我有一个用户验证,它接受用户名/密码并验证他们的帐户并返回登录成功/失败:

class Api_AuthController extends Zend_Controller_Action
{
  public function validateUserAction()
  {
    // extract, clean and validate $username from POSTed data
    // extract, clean and validate $password from POSTed data

    // access the data layer
    $accountMapper = new Application_Model_Mapper_Account();
    $accounts = $accountMapper(find(array('username' => $username, 'password' => $password));

    if (count($accounts) == 1) {
      // success
    } else {
      // failure
    }
  }
}

如前所述 - Application_Model_Mapper_Account 及其 find() 方法已在另一个单元测试中进行了测试,因此在此处再次测试是多余的(据我所知,单元测试 - 不可取,更不用说它不必要地减慢了我的测试速度) ,因为我真正需要测试的是动作区分 find 函数的两种可能结果的能力。

那么 - 我如何将映射器和模型的模拟替换到此操作中,以便我可以限制 validateUserAction 测试的范围?

【问题讨论】:

  • @BiggsTRC - 感谢编辑
  • 大声笑,没问题。我只是更改了一个单引号,以使您的代码格式正确。

标签: php unit-testing zend-framework architecture


【解决方案1】:

我来自.net 世界,但我们在控制器中使用Inversion of Control containers to allow us to inject any dependencies。通过这种方式,您可以模拟任何依赖项以按照您的意愿行事,并将测试重点放在操作上。

【讨论】:

  • hmm.. 所以,在 Zend 中有一个 Registry 单例 - 这是否适合 IoC 容器?
  • @HorusKol:我希望我能帮助你,但我对 Zend 几乎一无所知。让我看看能不能找到。
  • @HorusKol: This link 有点老了,但似乎涵盖了这个话题。祝你好运。
猜你喜欢
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
  • 2020-04-25
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多