我正在尝试为我的 Slim PHP 应用程序中的单个函数编写一个简单的单元测试。该函数使用 mkdir() 创建一个目录,我希望测试断言该目录已成功创建。使用前端应用程序测试时,文件夹创建成功,但运行测试时,找不到目录1) TestController::testCreate mkdir(): 没有那个文件或目录我们使用以下方法自动加载类://composer.json "autoload": { "psr-4": { "App\\": "app", "tests\\": "tests/" } }这是创建目录的函数://Controllor.phppublic function create($request, $response){ mkdir("../public/folder");}使用该应用程序,这会按预期在以下位置创建一个目录-app-public/folder这是测试功能的示例://TestController.phppublic function testCreate(){ $controller = new Controller($this->container); $request = $this->requestFactory(); $response = new \Slim\Http\Response(); $response = $controller>create($request, $response, []); //Assertions below..}我正在使用 phpunit.xml 通过将 bootstrap="vendor/autoload.php" 插入配置文件来引导 autoload.php 文件。我还尝试从 TestController.php 中要求 vendor/autoload.php 并尝试$_SERVER['DOCUMENT_ROOT']在 TestController.php 中手动设置如何在运行 TestController.php 时自动加载命名空间,以便 create() 函数从正确的位置调用 mkdir()?
2 回答
慕婉清6462132
TA贡献1804条经验 获得超2个赞
嗯,有一个小问题和一个大问题。
小的——你正在失去上下文,特别是工作目录。因此,不清楚您的目录在哪里创建,以及该位置是否实际上可写。为了克服这个问题,我会创建一个可配置的值——一个应该发生事情的目录名称。对于实际用例,我会提供 $_SERVER['DOCUMENT_ROOT'] (或任何其他合适的值),对于我会使用的测试/tmp
(或更好sys_get_temp_dir()
)。
为了更好地说明第一个问题(您要问的问题):
目前您的代码假设了一些关于运行环境的假设,并且该假设不是一个安全的假设,例如“总是有
array_keys()
可用的功能”将此类假设转换为可配置值是一种很好的做法
使其可配置也使测试更容易,因为您的测试环境与您的生产/开发/登台环境分离
更大的一个——这不是一个单元测试,因为你正在检查你的代码如何与一些外部实体交互,在这种情况下是文件系统。这是一个功能测试。要进行单元测试,您需要模拟mkdir()
,为此您需要将它抽象到一些像这样的接口后面:
interface DirMaker {
public function mkdir($name);
}
该接口的实现也可以处理配置。在测试中,您可以提供一个模拟,它只承认mkdir()被调用的事实,正如预期的那样。
- 2 回答
- 0 关注
- 166 浏览
添加回答
举报
0/150
提交
取消