序言
我使用source_gen生成Dart代码。我想测试我的生成器的输出(使用测试包)。我查看了source_gen的测试,并使用了json_serializable_test.dart作为模板。我可以调用generate
我的生成器并将结果作为字符串获取。现在我想测试一下,类和方法是否按我的预期生成。可悲的是, json_serializable_test.dart中缺少这种测试:
expect(output, isNotNull);
// TODO: test the actual output
// print(output);
我修改了助手(如_getCompilationUnitForString
)以传递源(而不是总是使用_testSource
)并获取其分析器元素。因此,我可以将生成器的输入和预期输出指定为文件或字符串,并获取输入、输出和预期输出的分析器元素。
方法
我想出了这种通过名称和字段声明匹配类的原始方法:
import 'package:analyzer/src/generated/element.dart';
import 'package:source_gen/src/utils.dart';
import 'package:test/test.dart';
Matcher equalsClass(expected) => new ClassMatcher(expected);
class ClassMatcher extends Matcher {
final ClassElementImpl _expected;
const ClassMatcher(this._expected);
@override
Description describe(Description description) => description
.add('same class implementation as ')
.addDescriptionOf(_expected);
@override
Description describeMismatch(ClassElementImpl item, Description description,
Map matchState, bool verbose) => description
.add('${friendlyNameForElement(item)}')
.add(' differs from ')
.add('${friendlyNameForElement(_expected)}');
@override
bool matches(ClassElementImpl item, Map matchState) {
return (item.displayName == _expected.displayName) &&
unorderedEquals(_mapFields(item.fields))
.matches(_mapFields(_expected.fields), matchState);
}
}
Iterable _mapFields(List<FieldElement> fields) => fields
.map(friendlyNameForElement);
此解决方案可能容易出错,因为我通过字符串表示来比较字段。除此之外,失配描述非常差。如何改进我的匹配器?
Ps:有没有更好的方法来比较生成的代码和期望?