You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pharo代码生成测试类未在系统浏览器包中显示问题求助

问题诊断与解决方案

你的问题源于两处细节错误:类定义字符串的引号拼接语法问题,以及缺少类定义的编译加载逻辑。

1. 修复类定义字符串的引号错误

你在buildTestClassDefinitionFrom:方法中,包名部分的结尾引号拼接有误,导致生成的类定义存在语法问题。原代码末尾的四个单引号会让生成的字符串多一个冗余单引号,Pharo无法正确解析包名。

修正后的buildTestClassDefinitionFrom:方法:

buildTestClassDefinitionFrom: aClass
    ^ 'TestCase subclass: ', (self buildTestClassNameFrom: aClass) printString, '
    instanceVariableNames: ''''
    classVariableNames: ''''
    poolDictionaries: ''''
    package: ''', (self buildTestPackageNameFrom: aClass), ''''

注意将末尾的''''改为''',这样生成的包名部分会是标准的package: 'Car-Tests'格式。

2. 添加类定义的编译加载逻辑

仅生成类定义字符串是不够的,需要让Pharo编译并将类加载到系统中。添加以下执行逻辑:

generateTestClassFor: aClass
    | classDefinition |
    classDefinition := self buildTestClassDefinitionFrom: aClass.
    Compiler evaluate: classDefinition.
    "强制刷新系统浏览器,确保类及时显示"
    Smalltalk tools browser refresh

调用这个方法传入Car类后,Pharo会编译并创建CarTest类,同时刷新浏览器让类显示在对应包中。

3. 可选:提前确保测试包存在

Pharo编译类定义时会自动创建不存在的包,但如果需要提前确认包存在,可以添加以下方法:

ensureTestPackageExistsFor: aClass
    | testPackageName |
    testPackageName := self buildTestPackageNameFrom: aClass.
    (RPackageOrganizer default includesPackageNamed: testPackageName)
        ifFalse: [ RPackageOrganizer default createPackageNamed: testPackageName ]

在生成类之前调用该方法,可提前创建目标测试包。

完整调用示例

self ensureTestPackageExistsFor: Car.
self generateTestClassFor: Car.

执行后,CarTest类会出现在系统浏览器的Car-Tests包中。

内容的提问来源于stack exchange,提问作者Mansour Faouziel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 14:35:56