在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个不同的类,所以这就是我遇到的问题。
答案 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%的具体细节,但我注意到它没有回答所以只是想根据最终的代码更新我做的。谢谢!