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
相关产品推荐
相关产品推荐

