在Dart中测试代码生成时出错:生成器未能写入资源
我已经创建了一个Dart(Dart v2)代码生成器来检测Cooper类型的注释 生成器如下所示:在Dart中测试代码生成时出错:生成器未能写入资源,dart,flutter,Dart,Flutter,我已经创建了一个Dart(Dart v2)代码生成器来检测Cooper类型的注释 生成器如下所示: class CooperGenerator extends GeneratorForAnnotation<Cooper> { @override Future<String> generateForAnnotatedElement( Element element, ConstantReader annotation, BuildStep buildSt
class CooperGenerator extends GeneratorForAnnotation<Cooper> {
@override
Future<String> generateForAnnotatedElement(
Element element, ConstantReader annotation, BuildStep buildStep) async {
final name = annotation?.peek("implementationClassName")?.stringValue ?? "CooperApi";
return "class $name {}";
}
}
import 'package:build/build.dart';
import 'package:test/test.dart';
import 'package:build_test/build_test.dart';
import 'package:source_gen/source_gen.dart';
import 'package:cooper_generator/cooper_generator.dart';
void main() {
group('CooperGenerator', () {
test('generates implementation for classes annotated with @Cooper',
() async {
final builder = PartBuilder([CooperGenerator()], '.g.dart');
await testBuilder(builder, _inputs, outputs: _output);
});
});
}
final _output = {
"jorge|lib/coop.g.dart": '''
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'coop.dart';
// **************************************************************************
// CooperGenerator
// **************************************************************************
class CooperImplementation {}
'''
};
final _inputs = <String, String>{
'cooper|lib/cooper.dart': _cooperSource,
'jorge|lib/coop.dart': _classToGenerate,
};
const String _classToGenerate = r'''
import 'package:cooper/cooper.dart';
@Cooper("CooperImplementation")
abstract class CooperContract {}
''';
const String _cooperSource = r'''
class Cooper {
final String implementationClassName;
const Cooper(this.implementationClassName);
}
''';
类CooperGenerator扩展GeneratorForAnnotation{
@凌驾
未来生成ForNotatedElement(
元素元素,ConstantTreader注释,BuildStep(BuildStep)异步{
最终名称=注释?.peek(“implementationClassName”)?.stringValue???“CooperApi”;
返回“class$name{}”;
}
}
我正在编写单元测试,以验证我的生成器是否按预期工作。看起来像这样:
class CooperGenerator extends GeneratorForAnnotation<Cooper> {
@override
Future<String> generateForAnnotatedElement(
Element element, ConstantReader annotation, BuildStep buildStep) async {
final name = annotation?.peek("implementationClassName")?.stringValue ?? "CooperApi";
return "class $name {}";
}
}
import 'package:build/build.dart';
import 'package:test/test.dart';
import 'package:build_test/build_test.dart';
import 'package:source_gen/source_gen.dart';
import 'package:cooper_generator/cooper_generator.dart';
void main() {
group('CooperGenerator', () {
test('generates implementation for classes annotated with @Cooper',
() async {
final builder = PartBuilder([CooperGenerator()], '.g.dart');
await testBuilder(builder, _inputs, outputs: _output);
});
});
}
final _output = {
"jorge|lib/coop.g.dart": '''
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'coop.dart';
// **************************************************************************
// CooperGenerator
// **************************************************************************
class CooperImplementation {}
'''
};
final _inputs = <String, String>{
'cooper|lib/cooper.dart': _cooperSource,
'jorge|lib/coop.dart': _classToGenerate,
};
const String _classToGenerate = r'''
import 'package:cooper/cooper.dart';
@Cooper("CooperImplementation")
abstract class CooperContract {}
''';
const String _cooperSource = r'''
class Cooper {
final String implementationClassName;
const Cooper(this.implementationClassName);
}
''';
导入“包:build/build.dart”;
导入“包:test/test.dart”;
导入“包:build_test/build_test.dart”;
导入“包:源代码/源代码.省道”;
导入“包:库珀_生成器/cooper_生成器.dart”;
void main(){
组('CooperGenerator',(){
test('为带@Cooper'注释的类生成实现,
()异步{
最终生成器=零件生成器([CooperGenerator()],“.g.dart”);
等待testBuilder(生成器,_输入,输出:_输出);
});
});
}
最终输出={
“豪尔赫| lib/coop.g.dart”:”
//生成的代码-不要手动修改
“鸡笼飞镖”的一部分;
// **************************************************************************
//库珀发生器
// **************************************************************************
类协同实现{}
'''
};
最终输入={
“cooper | lib/cooper.dart”:_cooperSource,
“jorge | lib/coop.dart”:“类生成”,
};
常量字符串_classToGenerate=r''
导入“包:cooper/cooper.dart”;
@库珀(“合作实施”)
抽象类CooperContract{}
''';
常量字符串_cooperSource=r''
库珀班{
最终字符串实现classname;
const Cooper(this.implementationClassName);
}
''';
代码运行得非常好,它生成了我期望的代码。但是,在运行单元测试时,我遇到了以下错误,我无法理解原因:
ERROR: Expected: contains AssetId:<jorge|lib/coop.g.dart>
Actual: ?:[]
Builder failed to write asset jorge|lib/coop.g.dart
package:test expect
package:build_test/src/test_builder.dart 49:7 checkOutputs.<fn>
dart:collection __InternalLinkedHashMap&_HashVMBase&MapMixin&_LinkedHashMapMixin.forEach
package:build_test/src/test_builder.dart 41:13 checkOutputs
package:build_test/src/test_builder.dart 140:3 testBuilder
===== asynchronous gap ===========================
dart:async _AsyncAwaitCompleter.completeError
package:build_test/src/test_builder.dart testBuilder
===== asynchronous gap ===========================
dart:async _asyncThenWrapperHelper
package:build_test/src/test_builder.dart testBuilder
test/generator_test.dart 12:13 main.<fn>.<fn>
错误:应为:包含AssetId:
实际:?:[]
生成器未能写入资产jorge | lib/coop.g.dart
包:测试预期
包:build\u test/src/test\u builder.dart 49:7检查输出。
dart:collection\u InternalLinkedHashMap和\u HashVMBase&MapMixin和\u LinkedHashMapMixin.forEach
包:build\u test/src/test\u builder.dart 41:13检查输出
包:build\u test/src/test\u builder.dart 140:3 testBuilder
======异步间隙===========================
dart:async\u AsyncAwaitCompleter.completeError
包:build\u test/src/test\u builder.dart testBuilder
======异步间隙===========================
dart:async\u asyncThenWrapperHelper
包:build\u test/src/test\u builder.dart testBuilder
试验/发电机试验。dart 12:13主。。
有人知道为什么这会给我这个错误吗