如何在dart only riverpod 2.0中创建单元测试?

xzabzqsa  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(104)

如何为setState方法创建单元测试?这当然是一个微不足道的例子,但我会有更复杂的例子。我只需要把我的大部分业务逻辑都用在dart里。

class TodoItem {
  final String id;
  TodoItem({required this.id});
}

@riverpod
class TodoItems extends _$TodoItems {
  @override
  List<TodoItem> build() => [];
  void setState(List<TodoItem> newState) => state = newState;
}

字符串

mwkjh3gx

mwkjh3gx1#

最简单的方法在Riverpod文档中描述。创建一个ProviderContainer,然后在该容器上使用read和listen方法模拟ref.read和ref.watch/listen。例如,可以使用类似container.read(todoItemsProvider.notifier).setState('thing')的东西,然后检查container.read(todoItemsProvider)是否为thing。您还可以添加侦听以确保它正在通知。
如果您的提供程序依赖于其他提供程序,您可以通过在ProviderContainer构造函数中使用重写来隔离它们以模拟依赖项。因此,您可以根据需要测试尽可能少或尽可能多的提供商网络。

编辑

最简单的例子(保持单个测试干净)

void main() {
  final container = ProviderContainer();

  tearDown(() => addTearDown(container.dispose));

  test('State is being set', () {
    var newState = [TodoItem(id: '1')];
    container.read(todoItemsProvider.notifier).setState(newState);
    var stateInProvider = container.read(todoItemsProvider);

    expect(stateInProvider.length, 1);
  });
}

字符串

相关问题