测试生成的Dart代码

时间:2015-08-10 14:42:10

标签: unit-testing dart code-generation dart-analyzer

的Prolog

我使用source_gen生成Dart代码。我想测试我的生成器的输出(使用test包)。我查看了source_gen的测试,并使用json_serializable_test.dart作为模板。我可以在我的生成器上调用generate并将结果作为字符串获取。现在我想测试一下,如果按照我的预期生成类和方法。可悲的是,json_serializable_test.dart中缺少这种测试:

expect(output, isNotNull);

// TODO: test the actual output
// print(output);

我修改了帮助器(如_getCompilationUnitForString)以传递源(而不是始终使用_testSource)并获取其analyzer元素。因此,我可以将生成器的输入和预期输出指定为文件或字符串,并获取输入,输出和预期输出的analyzer元素。

方法

我提出了这种原始方法,通过名称和字段声明来匹配类:

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:有没有更好的方法来比较生成的代码和预期?

0 个答案:

没有答案