Php 停留在模拟3类1单元测试上

Php 停留在模拟3类1单元测试上,php,unit-testing,phpunit,Php,Unit Testing,Phpunit,在Authentication.php中,我想为以下函数创建一个测试: function showModal() { $registration = new Registration; $registration->needShowModal = Store::isUserSupported() ? false : true; } 到目前为止,在我的测试用例中,我有一个模拟存储: function testShowModal() { $mockStore = $t

在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传递到身份验证控制器中,大致如下:

$controller = new Authentication($mockStore,$mockRegistration);
但是,当我创建身份验证时,它总是抱怨它希望请求和响应对象作为前两个参数。。所以也许这不是正确的方法


如何最好地为isUserSupported==true和isUserSupported==false编写测试?在这个测试中,我要处理3个不同的类,所以这就是我被卡住的地方。

查看。在这种情况下,如果您不想将其作为参数传入,我会做的是使用一个单独的类为您创建注册对象。在其他好处中,当您对新类调用
createRegistrationObject()
时,您只需模拟新类即可返回注册对象(真实或模拟!)。

编写方法时,您无法传递任何模拟来替换对象

您正在调用
newregistration
,它将创建实际类的实例,而不是使用mock

静态调用
Store::isUserSupported()
也将调用实际方法
staticExpects
仅在测试静态调用的类时有效(您有一个静态方法在同一个类中调用不同的方法)。这样模仿就行不通了

要使其可测试,该方法应如下所示:

function showModal($registration, $store) {
  $registration->needShowModal = Store->isUserSupported() ? false : true;
}
现在您可以为依赖项创建mock,并将它们传递到方法中

尽管看起来您正在MVC框架控制器上测试一个操作。根据我的经验,对于控制器的测试,您的测试更多的是“集成”而不是“单元”。与其试图控制这些依赖关系,不如尝试控制正在使用的数据源,并确保响应返回时设置了正确的请求。这还可以让您知道其他类(它们都已经过测试)对传递给它们的内容的假设是正确的


在不了解框架或其他代码的情况下,这是我所能做的最好的事情。

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


这是一段时间以前的事了,所以我100%了解细节,但我注意到它没有得到回答,所以我只想在查看最终代码的基础上更新我所做的。谢谢

你好!你到底想测试什么?在您的示例中,showmodel()没有返回任何内容。一旦注册对象设置了needShowModal属性,它应该如何处理它?在哪里发生这种情况?如果你能帮助的话,让mock返回mock并不是一件好事。