坚持嘲笑3个单元进行1单元测试

时间:2014-03-10 05:37:55

标签: php unit-testing phpunit

在Authentication.php中我有以下函数我想为:

创建一个测试
function showModal() {
  $registration = new Registration;
  $registration->needShowModal = Store::isUserSupported() ? false : true;
}

到目前为止,在我的测试案例中,我有一个模拟商店:

function testShowModal() {
        $mockStore = $this->getMockClass(‘Store', array('isUserSupported'));

        $mockStore::staticExpects($this->any())
            ->method('isUserSupported')
            ->will($this->returnValue(true)); 
}

我猜我接下来需要创建一个mockRegistration并将它和mockStore传递给Authentication控制器,这有点像:

$controller = new Authentication($mockStore,$mockRegistration);

然而,当我创建身份验证时,它一直在抱怨它希望请求和响应对象作为前2个参数...所以也许这不是正确的方法。

我如何才能最好地为isUserSupported == true和isUserSupported == false编写测试?我在这个测试中处理了3个不同的类,所以这就是我遇到的问题。

3 个答案:

答案 0 :(得分:1)

编写方法时,您无法通过任何模拟来替换对象。

您正在调用new Registration,它将创建实际类的实例,而不是使用模拟。

静态调用Store::isUserSupported()也会调用实际方法。 staticExpects仅在测试静态调用的类时有效(您有一个静态方法在同一个类中调用不同的方法)。所以模拟不起作用。

为了使其可测试,该方法应该是这样的:

function showModal($registration, $store) {
  $registration->needShowModal = Store->isUserSupported() ? false : true;
}

现在,您可以为依赖项创建模拟并将它们传递给方法。

虽然看起来您正在测试MVC框架控制器上的操作。根据我的经验,为了测试控制器,您的测试最终会变得更“集成”而不是“单元”。尝试控制正在使用的数据源,并确保使用正确的请求适当地设置响应,而不是尝试控制这些依赖关系。这也让你知道其他类(所有类都已经过测试)对传递给它们的内容有正确的假设。

在不了解更多关于框架或其他代码的情况下,这是我能够做到的最好的。

答案 1 :(得分:0)

查看Factory Pattern。如果你不想把它作为参数传递,我会在这种情况下做什么,有一个单独的类为你创建Registration对象。除了其他好处之外,当您在新课程上调用createRegistrationObject()时,您只需要模拟新课程以返回注册对象(真实或模拟!)。

答案 2 :(得分:0)

我最终做了以下事情: 1.模拟配置值 2.在模拟控制器上调用getPublicClass函数 3.调用mockedController-> testFunction()

这是前一段时间所以我100%的具体细节,但我注意到它没有回答所以只是想根据最终的代码更新我做的。谢谢!