如何用phpunit模拟Yii@1.1的CActiveRecord(避免空属性)?

oewdyzsn  于 2022-11-09  发布在  PHP
关注(0)|答案(1)|浏览(102)

遗留项目使用Yii@1.1,其数据库实体为CActiveRecord的示例。
假设我有一个名为User的模型,它具有idfirstnamelastname属性。
在一个服务DoSomethingWithUser中,我以只读方式访问实体:

class DoSomethingWithUser {
    public function doSth(User $user) {
        $id = $user->id;
        $name = $user->name;
        $lastname = $user->lastname;

        ...

        return $result;
    }
}

在服务的测试用例中,我想注入一个CActiveRecord的mock,所以我天真地认为我可以这样做:

class DoSomethingWithUserTest extends TestCase
    testdoSth() {
        /**
         * @var User|MockObject $user
         */

        $user = $this->createMock(User::class);
        $user->id = 23;
        $user->lastname = "LAST_NAME";
        $user->firstname = "FIRST_NAME";

        $actualResult = (new DoSomethingWithUser())->doSth($user);

        $this->assertSame($expectedResult, $actualResult);
    }

我还尝试使用setAttributes

$user->setAttributes(
     ['id' => 23, 'firstname'  => 'FIRST NAME', 'lastname' => 'LAST NAME']
 );

但没有成功。
在测试运行时期间,这些属性始终为null
我想这与CActiveRecord的神奇getter有关,但我不知道如何去做。
如何模拟CActiveRecord的属性?

shyt4zoc

shyt4zoc1#

偶然间我发现陈言:

$user = $this->createMock(User::class);
$user->setMethods(['attributes'])
$user->id = 23;
$user->lastname = "LAST_NAME";
$user->firstname = "FIRST_NAME";

和预期的一样,虽然我不知道为什么。

相关问题