Flutter代码生成插件source_gen_test的使用

发布于 1周前 作者 vueper 来自 Flutter

Flutter代码生成插件source_gen_test的使用

插件简介

source_gen_test 是一个用于简化 package:source_gen 派生的 Generators 测试的工具。通过注解测试文件,可以方便地验证生成器的行为是否符合预期。它提供了如 @ShouldGenerate@ShouldThrow 等注解来定义期望的生成结果或异常抛出情况,并支持基于黄金文件(golden file)进行输出对比测试。

快速开始

添加依赖

pubspec.yaml 文件中添加 source_gen_test 作为开发依赖:

dev_dependencies:
  source_gen_test: ^最新版本号

示例代码

下面是一个完整的示例,展示了如何使用 source_gen_test 来测试自定义的代码生成器。

定义生成器和注解

首先,在你的项目中创建一个生成器和对应的注解。例如:

// example_generator.dart
import 'package:source_gen/source_gen.dart';
import 'package:build/build.dart';

class ExampleGenerator extends Generator {
  final bool requireTestClassPrefix;

  const ExampleGenerator({this.requireTestClassPrefix = true});

  @override
  generate(LibraryReader library, BuildStep buildStep) {
    // 实现生成逻辑
    return '';
  }
}

// src/example_annotation.dart
class TestAnnotation {
  const TestAnnotation();
}

编写测试用例

接下来,编写测试用例并使用 source_gen_test 提供的注解来指定期望的结果:

// test_class.dart
part 'goldens/test_class.dart';

import 'package:test/test.dart';
import 'package:source_gen_test/source_gen_test.dart';
import 'example_generator.dart';
import 'src/example_annotation.dart';

void main() {
  initializeBuildLogTracking();
  final reader = initializeLibraryReader();

  testAnnotatedClasses<ExampleAnnotation>(
    reader,
    const ExampleGenerator(),
    additionalGenerators: const {
      'no-prefix-required': ExampleGenerator(requireTestClassPrefix: false),
    },
  );
}

@ShouldGenerate(
  r'''
const TestClass1NameLength = 10;

const TestClass1NameLowerCase = 'testclass1';
''',
  configurations: ['default', 'no-prefix-required'],
)
@ShouldThrow(
  'Uh...',
  configurations: ['vague'],
  element: false,
)
@TestAnnotation()
class TestClass1 {}

part 'goldens/test_class2.dart';

@ShouldGenerateFile(
  'goldens/test_class2.dart',
  partOfCurrent: true,
  configurations: ['default', 'no-prefix-required'],
)
@ShouldThrow(
  'Uh...',
  configurations: ['vague'],
  element: false,
)
@TestAnnotation()
class TestClass2 {}

执行测试

确保你已经安装了必要的构建工具,并且可以通过命令行运行测试:

flutter pub get
flutter test

这将触发 source_gen_test 的执行,根据你在测试类上设置的注解来验证生成器的行为。

进阶用法

除了基本的字符串匹配和异常检测外,source_gen_test 还允许你对生成的代码进行更复杂的检查。比如,你可以通过 @ShouldGenerateFile 注解指定一个黄金文件路径,然后让测试框架自动比较生成的内容与该文件内容是否一致。这对于维护稳定的API文档或者确保特定格式的输出非常有用。

此外,还可以利用其他辅助函数和配置选项来自定义测试环境,满足不同的需求。具体细节请参考官方文档中的更多说明。

希望这个指南能帮助你更好地理解和使用 source_gen_test!如果有任何问题或建议,请随时向社区反馈。


更多关于Flutter代码生成插件source_gen_test的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter代码生成插件source_gen_test的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用Flutter代码生成插件source_gen_test的示例。需要注意的是,source_gen_test这个名称并不是Flutter官方或者广泛使用的代码生成插件,但为了演示,我们可以假设它是一个自定义的或者模拟的插件,用于生成一些测试代码。

在Flutter中,代码生成通常通过构建工具(如build_runner)和注解处理器(如json_serializable)来实现。以下是一个简化的例子,展示了如何使用自定义注解和代码生成器来生成测试代码。

1. 定义注解

首先,我们定义一个自定义注解,用于标记需要生成测试代码的类。

// annotations.dart
import 'package:meta/meta.dart';

@Target({TypeAnnotationTarget.classType})
@Retention(AnnotationRetention.SOURCE)
class GenerateTests {}

2. 创建代码生成器

接下来,我们创建一个代码生成器,它会在构建时读取注解并生成相应的测试代码。

// test_generator.dart
import 'dart:async';
import 'package:build/build.dart';
import 'package:source_gen/source_gen.dart';
import 'annotations.dart';

class TestGenerator extends GeneratorForAnnotation<GenerateTests> {
  @override
  FutureOr<String> generate(LibraryReader library, BuildStep buildStep) async {
    for (var classDecl in library.declaredElements) {
      if (classDecl is ClassElement &&
          classDecl.hasAnnotation(GenerateTests::class)) {
        var className = classDecl.displayName.split('.').last;
        var testContent = '''
import 'package:test/test.dart';

void main() {
  test('$className should have a test', () {
    // Placeholder for actual test logic
    var instance = ${className}();
    expect(instance, isNotNull);
  });
}
        ''';
        var outputId = buildStep.inputId.changeExtension('.tests.dart');
        await buildStep.writeAsString(outputId, testContent);
      }
    }
    return null;
  }
}

3. 配置build.yaml

为了让构建工具知道我们的代码生成器,我们需要配置build.yaml文件。

# build.yaml
builders:
  generate_tests:
    target: ":test_generator"
    build_extensions: { ".dart": [".tests.dart"] }
    auto_apply: root_package
    build_to: source
    depends_on: ["build_config"]

4. 使用注解

现在,我们可以在我们的Flutter项目中使用这个注解,并运行构建工具来生成测试代码。

// example.dart
@GenerateTests
class Example {
  // Some class implementation
}

5. 运行构建

在项目根目录下运行以下命令来应用代码生成器:

flutter pub get
dart run build_runner build

运行完上述命令后,你应该会在项目目录中看到一个新生成的.tests.dart文件,其中包含为Example类生成的测试代码。

生成的测试代码示例

// example.tests.dart
import 'package:test/test.dart';

void main() {
  test('Example should have a test', () {
    // Placeholder for actual test logic
    var instance = Example();
    expect(instance, isNotNull);
  });
}

请注意,上述代码是一个简化的示例,用于演示如何自定义注解和代码生成器。在实际项目中,你可能需要处理更多的边缘情况和错误处理。同时,source_gen_test这个名称可能并不真实存在,所以你需要根据你的实际插件名称和配置进行调整。

回到顶部