【发布时间】:2021-04-14 16:19:51
【问题描述】:
我正在尝试测试一个名为 Game 的 OCaml 模块。但是,Game 的初始化函数在我项目的正常上下文中使用时,只接受几个参数。这意味着某些测试需要我初始化Game,然后执行数百个操作的特定组合才能达到所需的状态,这是不可行的。
我的想法是创建一个新的 init 函数,允许用户对 Game 对象的每个组件进行硬编码。因为它只用于测试,所以让这个 init 函数成为典型 mli 接口的一部分似乎是个坏主意,所以我认为在我的 testGame.ml 文件中使用关键字 include 会有所帮助。
在我的 testGame.ml 中,generate_player_ids 和 Game.t 类型都是“未绑定的”,即使我在 test.ml 中定义了它们。这一定是因为它们没有在game.mli 中公开,但我认为使用include 本质上就像复制和粘贴整个模块,包括.ml 文件中未公开的部分。有没有办法让testGame.ml 识别这些?否则,为了测试目的,拥有识别模块隐藏部分的函数的惯用方法是什么?
testGame.ml:
include Game
let init_game_test
num_players
board
turn
starting_turn
setup_rounds_left
scoring_points
num_rounds =
let player_ids = generate_player_ids num_players in
{
players = players_of_player_ids player_ids;
player_order = player_ids;
board;
turn;
starting_turn;
setup_rounds_left;
scoring_points;
num_rounds;
}
game.ml:
type t = {
players : (PlayerId.t * Player.t) list;
player_order : PlayerId.t list;
board : Board.t;
turn : PlayerId.t;
starting_turn : PlayerId.t;
setup_rounds_left : int;
scoring_points : (Cell.soil * int list) list;
num_rounds : int;
}
let generate_player_ids num_players =
match num_players with
| 2 -> [ 1; 2 ]
| 3 -> [ 1; 2; 3 ]
| 4 -> [ 1; 2; 3; 4 ]
| _ -> failwith "Must be 2-4 players"
【问题讨论】: