如何对状态机进行单元测试?

发布于 2024-12-10 06:42:35 字数 302 浏览 0 评论 0原文

假设我有一个 Order 类,它可以处于三种不同的状态:CheckedState、PaidState 和 OrderedState。

状态机将使用标准状态设计模式(Gof)来实现。

您通常如何对此进行单元测试?您是否为每个状态类(CheckStateFixturePaidFixture,...)使用一个固定装置,并为上下文类使用另一个固定装置(OrderFixture)?或者您是否只使用一个用于放置所有单元测试的上下文类 (Order) 固定装置?

Suppose I have an Order class, which can be in three different states : CheckedState, PaidState and OrderedState.

The state machine will be implemented using the standard State Design Pattern (Gof).

How do you usually unit test this? Do you use a fixture for each state class (CheckStateFixture, PaidFixture, ...) and one another (OrderFixture) for the context class? Or do you use only one fixture for the context class (Order) in which you'll put all the unit tests?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

九歌凝 2024-12-17 06:42:35

我更喜欢将国家基础设施与实体本身分开。
因此,您将拥有

  • 实体类(订单)
  • 状态基础设施类

对于状态基础设施,我建议每个实体使用单个固定装置,因此订单状态基础设施的一个 OrderStateFixture 就足够了。

主要测试是确保订单状态正确切换的测试:

  • 确保订单的初始状态为 NotChecked
  • 在成功执行 Order.Paid(amount) 方法 Order.State 切换到 Paid 后
  • 如果 Order.Verify() 无例外地返回 true/pass - Order.State 变为 Checked/Verified

I preffer to keep State Infrastructure separately from entity itself.
So you would have

  • Entity class (Order)
  • State infrastructure classes

For States Infrastructure I would suggest using single fixture per entity, so one OrderStateFixture for Order States Infrastructure will be enough.

The main tests would be the tests which ensures that Order state switches correctly:

  • Ensure that initial state of an order is NotChecked
  • After the successfull execution of the Order.Paid(amount) method Order.State switches to Paid
  • If Order.Verify() returns true/pass without exception - Order.State becomes Checked/Verified
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文