PHP PHPUnit 测试用例

PHP PHPUnit Test Case

提问人:Rizeen 提问时间:8/31/2023 最后编辑:ADysonRizeen 更新时间:8/31/2023 访问量:34

问:

编写一个类“Skill”,用于处理以“has_”关键字开头的任何函数,返回函数“exist”,以及以任何应返回“不存在”的单词开头的任何其他函数,并检查属性,如果它以“_CT”结尾,则返回属性的 md5 加密,否则返回不加密。

我使用过魔术函数和面向对象编程。

以下是包含类技能和测试用例代码的文件:

技能.php


<?php declare(strict_types=1);

namespace Exam;

class Skill
{
    public function __call($name, $args)
    {
        if (str_starts_with($name, 'has')) {
            return true;
        } else {
            return false;
        }
        if (str_ends_with($args, 'CT')) {
            return true;
        } else {
            return  false;
        }  
    }
}

技能测试 .php


<?php

use Coalition\Exam\Skill;
use PHPUnit\Framework\TestCase;

class SkillTest extends TestCase
{
    public function testHasFunctionExists(): void
    {
        $skill = new Skill();
        $function = 'has' . $this->generateRandomString(5);
        $this->assertTrue($skill->$function(), 'success');
    }

    public function testHasPropertyExists(): void
    {
        $skill = new Skill();
        $property = $this->generateRandomString(7) . '_CT';

        $this->assertTrue($skill->$property == md5($property), 'success');
    }
     
    public function testHasAnyPropertyExists(): void
    {
        $skill = new Skill();
        $property = $this->generateRandomString(7);

        $this->assertFalse($skill->$property == md5($property), 'success');
    }

    public function testObjectAsString(): void
    {
        $skill = new Skill();
        $this->assertTrue( strpos($skill, 'CT') !== false, 'success');
    }

    public function testSetSkillLanguage(): void
    {
        $skill = new Skill();
        $skill->language = 'PHP';
        $this->assertTrue( $skill->language === 'PHP', 'success');
    }


    public function testInvoke(): void
    {
        $skill = new Skill();
        $this->assertEquals(10, $skill([3,7]));
    }

    private function generateRandomString($length = 10): string
    {
        $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $charactersLength = strlen($characters);
        $randomString = '';
        for ($i = 0; $i < $length; $i++) {
            $randomString .= $characters[rand(0, $charactersLength - 1)];
        }
        return $randomString;
    }

}

当我运行 PHPUnit 测试时,我收到错误。

有 2 个错误:

1)

SkillTest::testObjectAsString 类型错误:strpos():参数 #1 ($haystack) 必须是字符串类型,Coalition\Exam\Skill given

C:\xampp\htdocs\Rizeen-CT\tests\SkillTest.php:34

SkillTest::testInvoke 错误:Coalition\Exam\Skill 类型的对象是 不可调用

C:\xampp\htdocs\Rizeen-CT\tests\SkillTest.php:48

有 1 次失败:

SkillTest::testHasPropertyExists 成功 断言 false 失败 是真的。

C:\xampp\htdocs\Rizeen-CT\tests\SkillTest.php:20

错误!测试: 6, 断言: 4, 错误: 2, 失败: 1, 警告: 2, 弃用: 1.

我尝试将第一个参数声明为字符串,但错误仍然存在。

php 函数 oop 方法 phpunit

评论

1赞 ADyson 8/31/2023
php.net/manual/en/function.strpos.php - strpos 测试一个字符串在另一个字符串中的位置。 是一个对象,而不是一个字符串 - 因为错误很清楚告诉你。当你写作时,你实际上想达到什么目的?$skillstrpos($skill, 'CT') !== false
0赞 ADyson 8/31/2023
同样,不清楚你写的时候有什么意图......同样,是一个对象,它不是您可以调用的函数。这又是错误消息告诉您的内容。当代码完全荒谬以至于其背后的意图不清楚时,很难建议如何修复它。$skill([3,7])$skill
0赞 ADyson 8/31/2023
再一次,与(与失败报告有关)——你什么时候会期望这是真的?Skill 类甚至没有任何属性,更不用说任何设置了值的属性,更不用说任何设置值以某种方式等于随机生成的字符串的 md5 哈希值的属性了,该字符串的值在实例化时是未知的!从字面上看,这是没有意义的。我 - 再次 - 无法理解您试图用这段代码实现什么,因此无法建议如何成功更改它。$skill->$property == md5($property)
0赞 ADyson 8/31/2023
至于。。。从前,这其中有一些标点符号吗?或者这是您为这项作业提供的指示的精确副本?因为这本身是几乎无法理解的,从这个角度来看,我可以理解你如何难以实现它。Write a class 'Skill' that handles any function which starts with ‘has_’ keyword return function ‘exist’ and any other function that starts with any word that should return ‘not exist’ and checking a property if it ends with ‘_CT’ return md5 encryption for property otherwise return without encryption
0赞 Rizeen 8/31/2023
我需要将 $skill 对象作为字符串进行测试,如果 strpos($skill, 'CT') !== false,则返回 true。有没有办法将字符串从类 Skills 传递给函数?

答: 暂无答案