Flutter内联快照生成插件inline_snapshot的使用

Flutter内联快照生成插件inline_snapshot的使用

Inline Snapshot

test Pub Package likes popularity pub points

这是一个支持Dart内联快照测试的库,灵感来源于 expect-testrspec-inline-snapshotJest 等项目!

特性

  • 执行内联快照测试
  • 允许基于实际结果更新预期结果

什么是方便?

预期结果不是写入外部文件,而是存储在输入的同一位置。这使得验证输入和预期结果变得容易。由于测试可以自动更新,修改测试的唯一成本就是审查检测到的差异。

以下是一些可能使用内联快照测试的情况:

  • 测试编程语言中的解析器结果(例如,AST)
  • 测试代码格式化的输出
  • 测试代码压缩器的输出
  • 测试模板引擎的输出
  • 测试序列化/反序列化过程的输出
  • 测试数据转换或映射函数的输出

在这些情况下,预期结果可能是小的并且容易改变,内联快照测试允许你轻松更新预期结果,并在同一位置验证输入和输出。

开始使用

在你的 pubspec.yaml 文件中添加以下开发依赖项:

dev_dependencies:
  inline_snapshot: ^1.0.2

使用方法

import 'package:test/test.dart';
import 'package:inline_snapshot/inline_snapshot.dart';

void main() {
  tearDownAll(() async {
    await Expect.apply();
  });

  group('A group of tests', () {
    test('First Test', () {
      var e = Expect();
      //             ^替换 "actual string" 当运行 `UPDATE_EXPECT=1 dart test`
      e.eq("actual string");
    });
  });
}

在这个例子中,Expect 对象是空的。你可以通过运行以下命令来更新源代码中的预期结果:UPDATE_EXPECT=true dart test

这将更新源代码中的预期结果,如下所示:

import 'package:test/test.dart';
import 'package:inline_snapshot/inline_snapshot.dart';

void main() {
  tearDownAll(() async {
    await Expect.apply();
  });

  group('A group of tests', () {
    test('First Test', () {
      var e = Expect("actual string");
      //             ^已替换 "actual string"!!
      e.eq("actual string");
    });
  });
}

你可以将 UPDATE_EXPECT 设置为 1true。如果不指定它,Expect 对象的行为类似于 expect(actual, expected),并且在比较之前会移除预期结果中的前导换行符。

它是如何工作的

当你调用 Expect("expect string") 时,预期结果和调用者的所在位置会被存储。当调用 Expect#eq(actual: String) 时,实际值与预期结果进行比较。如果它们匹配,测试被认为是成功的,不再执行其他操作。如果不匹配,预期结果将被标记为替换。当执行 Expect.apply() 时,标记为替换的实际值将被替换为预期结果。

贡献者

许可证

MIT


示例代码

import 'package:test/test.dart';
import 'package:inline_snapshot/inline_snapshot.dart';

void main() {
  tearDownAll(() async {
    await Expect.apply();
  });

  group('A group of tests', () {
    test('First Test', () {
      var e = Expect();
      //             ^替换 "actual string" 当运行 `UPDATE_EXPECT dart test`
      e.eq("actual string");
    });
  });
}

更多关于Flutter内联快照生成插件inline_snapshot的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


inline_snapshot 是一个用于 Flutter 的插件,它可以帮助你在测试中生成内联的快照。快照测试是一种常用的测试方法,用于确保代码的输出与预期一致。inline_snapshot 的主要功能是自动生成和更新快照,从而简化测试过程。

安装

首先,你需要在 pubspec.yaml 文件中添加 inline_snapshot 依赖:

dev_dependencies:
  inline_snapshot: ^1.0.0

然后运行 flutter pub get 来安装依赖。

使用

inline_snapshot 的主要功能是通过 inlineSnapshot 函数来生成和更新快照。你可以在你的测试中使用它来捕获和验证输出。

基本用法

import 'package:flutter_test/flutter_test.dart';
import 'package:inline_snapshot/inline_snapshot.dart';

void main() {
  test('Example test with inline snapshot', () {
    final result = someFunction();
    inlineSnapshot(result); // 自动生成或更新快照
  });
}

在这个例子中,inlineSnapshot 函数会捕获 result 的值,并将其与之前生成的快照进行比较。如果快照不存在,它会自动生成一个新的快照。如果快照存在但不匹配,测试将失败,并提示你可以更新快照。

更新快照

如果代码的输出发生变化,你可能需要更新快照。inline_snapshot 提供了一个命令行工具来更新快照:

flutter test --update-snapshots

运行这个命令后,inline_snapshot 会更新所有不匹配的快照。

自定义快照名称

你可以为快照指定一个名称,以便在同一个测试中使用多个快照:

test('Example test with named inline snapshot', () {
  final result1 = someFunction();
  inlineSnapshot(result1, name: 'result1');

  final result2 = anotherFunction();
  inlineSnapshot(result2, name: 'result2');
});

多行快照

inline_snapshot 也支持多行快照。你可以使用多行字符串来捕获复杂的输出:

test('Example test with multiline inline snapshot', () {
  final result = '''
  This is a
  multiline
  string
  ''';
  inlineSnapshot(result);
});
回到顶部