首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >颤振综合试验机器人模式

颤振综合试验机器人模式
EN

Stack Overflow用户
提问于 2018-09-21 12:05:35
回答 1查看 1.1K关注 0票数 2

为了便于阅读颤振集成测试,我尝试使用机器人模式来编写如下代码(链接):

代码语言:javascript
复制
test('home', () async {
  driver = await FlutterDriver.connect();
  HomeRobot(driver)
    .seesFromPlacesField()
    .seesToPlacesField()
    .seesNotSwapButton();
});

基本的机器人类如下所示:

代码语言:javascript
复制
class RobotBase {
  RobotBase(this.driver, this.finder);

  final FlutterDriver driver;
  final SerializableFinder finder;

  sees(String valueKey) async {
    print("sees: $valueKey");
    await driver.waitFor(find.byValueKey(valueKey));
  }

  seesNot(String valueKey) async {
    print("sees not: $valueKey");
    await driver.waitForAbsent(find.byValueKey(valueKey));
  }
}

像这样的机器人:

代码语言:javascript
复制
class HomeRobot extends Robot {
  HomeRobot(FlutterDriver driver)
      : super(driver, find.byValueKey(home_keys.page));

  Future<HomeRobot> seesFromPlacesField() async {
    await sees(home_keys.fromPlaceField);
    return this;
  }

  Future<HomeRobot> seesToPlacesField() async {
    await sees(home_keys.toPlaceField);
    return this;
  }

  Future<HomeRobot> seesNotSwapButton() async {
    await seesNot(home_keys.swapButton);
    return this;
  }

  Future<HomeRobot> seesSwapButton() async {
    await sees(home_keys.swapButton);
    return this;
  }
}

但是,目前的工作测试是这样的:

代码语言:javascript
复制
test('home', () async {
  driver = await FlutterDriver.connect();
  HomeRobot r = HomeRobot(driver);
  await r.seesFromPlacesField().then((r) async {
    await r.seesToPlacesField().then((r) async {
      await r.seesNotSwapButton();
    });
  });
});

或者这个(等待):

代码语言:javascript
复制
test('home', () async {
  driver = await FlutterDriver.connect();
  HomeRobot r = HomeRobot(driver);
  r = await (await (await r
      .seesFromPlacesField())
      .seesToPlacesField())
      .seesNotSwapButton();
});

有什么好的办法把这个链接起来吗?

溶液

机器人建立了“工作”:

代码语言:javascript
复制
class HomeRobot extends Robot {
  HomeRobot(FlutterDriver driver, Future<void> work) : super(driver, work);

  HomeRobot seesFromPlacesField() {
    work = work.then((_) async => await seesKey(keys.homePageFromPlaceField));
    return this;
  }

  SearchRobot tapsOnFromPlacesField() {
    work = work.then((_) async => await tapsOnKey(keys.homePageFromPlaceField));
    return SearchRobot(driver, work);
  }

  // ...
}

class SearchRobot extends Robot {
  SearchRobot(FlutterDriver driver, Future<void> work) : super(driver, work);

  SearchRobot seesBackButton() {
    work = work.then((_) async => await seesTooltip(Robot.backButtonTooltip));
    return this;
  }

  HomeRobot tapsOnBackButton() {
    work = work.then((_) async => await tapsOnTooltip(Robot.backButtonTooltip));
    return HomeRobot(driver, work);
  }

  // ...
}

基类提供所有基本步骤:

代码语言:javascript
复制
class Robot {
  Robot(this.driver, this.work);

  final FlutterDriver driver;

  Future<void> work;

  seesKey(String key) async {
    print("sees key: $key");
    await driver.waitFor(find.byValueKey(key));
  }

  tapsOnKey(String key) async {
    print("taps on key: $key");
    await driver.tap(find.byValueKey(key));
  }

  // ...
}

一个测试用例如下所示:

代码语言:javascript
复制
test('home', () async {
  HomeRobot robot = HomeRobot(driver, Future.value(null));
  await robot
      .seesFromPlacesField()
      .seesToPlacesField()
      .seesNotSwapButton()
      .tapsOnFromPlacesField()
      .seesSearchField()
      .seesBackButton()
      .tapsOnBackButton()
      .seesFromPlacesField()
      .work;
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-22 05:16:46

我试图修改您想要的API --但是我添加了第二个类来实现。本例中的机器人包含与驱动程序交互所需的实际异步命令。相应的"Work“类包含一个未来,它是在调用方法时逐步建立起来的。这些方法依次调用机器人上的实际异步工作,但是我们可以继续调用它们,而无需等待机器人完成。最后,我们返回可以等待完成的所有工作的最后未来。

请注意,在这种情况下,我们不能使用..语法,因为我们需要对工作类返回的值调用await

代码语言:javascript
复制
 final driver = await FlutterDriver.connect();
 final robot = HomeRobot(driver);
 await robot.start()
   .seesFromPlacesField()
   .seesToPlacesField()
   .seesNotSwapButton()
   .work();


class HomeRobot {
  HomeRobot(this.driver);
  final FlutterDriver driver;

  /// Create a new work class which builds up a Future.
  HomeRobotWork start() => new HomeRobotWork(this);

  Future<void> _seesFromPlacesField() async { ... }

  Future<void> _seesToPlacesField() async { ... }

  Future<void> _seesNotSwapButton() async { ... }
}

class HomeRobotWork {
  HomeRobotWork(this.robot);
  final HomeRobot robot;
  Future<void> _result = new Future.value(null);

  /// Add a future onto the result value
  void seesFromPlacesField() {
    _result = _result.then((_) => robot._seesFromPlacesField());
    return this;
  }

  void seesToPlacesField() {
    _result = _result.then((_) => robot._seesToPlacesField());
    return this;
  }

  void seesNotSwapButton() {
    _result = _result.then((_) => robot._seesNotSwapButton());
    return this;
  }

  Future<void> work() => _result;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52443411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档