flutter Mocktail:你到底在测试什么?

yqhsw0fo  于 2023-06-30  发布在  Flutter
关注(0)|答案(1)|浏览(127)

我是Flutter Mocktail的新手,我想知道它是如何工作的,因为对我来说,它看起来像我只是注入一些值,这些值被验证,而实际上并没有确保功能按预期工作。
下面是一个例子:

test('Dices are used', () {

      when(() => dices.diceOne.use()).thenReturn(true);
      when(() => dices.areUsed()).thenReturn(false);
      expect(dices.areUsed(), false);

      when(() => dices.diceTwo.use()).thenReturn(true);
      when(() => dices.areUsed()).thenReturn(true);
      expect(dices.areUsed(), isTrue);

    });

//Dice
 void use() {
    if (isDoubleDice) {
      isDoubleDice = false;
    } else {
      used = true;
    }
  }

//Dices
  bool areUsed() {
    return diceOne.used && diceTwo.used;
  }

我的场景如下:

  • 使用第一个骰子时,确保areUsed为false
  • 在使用第二个骰子后,确保areUsed为True

对我来说,看起来我在这里所做的一切实际上只是“好吧,我在这一行从模拟器中分配了true,在下一行我将确保它实际上是true。
有没有人能解释一下这个模拟尾巴在做这样的事情时到底想达到什么目的?
即使在mocktail's documentation example有这一部分:

class Cat {
  String sound() => 'meow!';
  bool likes(String food, {bool isHungry = false}) => false;
  void eat<T extends Food>(T food) {}
  final int lives = 9;
}

// A Mock Cat class
class MockCat extends Mock implements Cat {}


 test('example', () {
      // Stub a method before interacting with the mock.
      when(() => cat.sound()).thenReturn('purr');

      // Interact with the mock.
      expect(cat.sound(), 'purr');

它在这里测试什么?它只是为声音分配一个随机字符串,然后期望在调用cat.sound时,结果是前一行分配的字符串。这里到底测试了什么,这种方法有什么用?

bd1hkmkf

bd1hkmkf1#

如何使用mocktail的简单示例。
在我的示例中,我使用MockCat来测试CatOwner类。这使我能够快速更改Cat类中函数的结果,而无需启动新的Cat和新的CatOwner示例。
mocktail中的文档只向您展示了库是如何工作的。不知道怎么用。

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

class Cat {
  final List<String> preferredFoods;
  
  Cat(this.preferredFoods);

  bool likes(String food) => preferredFoods.contains(food);
}

class CatOwner {
  final Cat cat;
  const CatOwner(this.cat);

  bool get catLikesFish => cat.likes('fish');
}

// A Mock Cat class
class MockCat extends Mock implements Cat {}

void main() {
  final MockCat cat = MockCat();
  final CatOwner catOwner = CatOwner(cat);

  test('test CatOwner', () {
    when(() => cat.likes('fish')).thenReturn(true);
    expect(catOwner.catLikesFish, true);

    when(() => cat.likes('fish')).thenReturn(false);
    expect(catOwner.catLikesFish, false);
  });
}

相关问题