【发布时间】:2021-06-28 22:19:55
【问题描述】:
您如何对不返回任何内容但会更改变量值的函数进行单元测试?
我浏览了很多 S.O.尝试寻找答案的问题;以下是一些稍微受过教育的猜测:
- 在 Jest 的 test() 中,运行该函数,然后检查是否有
variable = expectedValue - 这个用例不需要单元测试,它是一个简单的变量赋值
- 专门重写函数,使其返回一些东西
- 如果不返回任何内容,则该函数不应该存在,只需将初始化代码放入父函数中即可
1 似乎是最好的答案; 2 可能是对的 - 我是新手,仍在弄清楚 究竟是什么 需要测试;对于某些用例,3 感觉有点过头了; 4 并不总是正确的,有时您只需要为了可读性而拆分功能即可。
我的具体用例:
initializeGame 在playGame 函数中被调用。它不返回任何东西;它只是将一些变量设置为它们的开始条件(玩家 X 的回合、空棋盘等)。例如,我如何测试 gameTracker 是否设置为 []?
let gameTracker = [], turn;
const turnX = 'X', turnO = 'O';
function playGame() {
$(document).ready(function () {
initializeGame();
$('.square').click(function () {
makeMove($(this));
endTurn();
});
});
}
function initializeGame() {
$('.start').css('display', 'none');
$('.square').children('p').text('');
gameTracker = [];
turn = turnX;
$('h1').text('Player ' + turn + ' Turn');
}
还有测试:
const tictactoe = require('./tictactoe');
test('gameTracker should equal [] after running initializeGame()', () => {
tictactoe.initializeGame();
expect(gameTracker).toBe([]);
})
【问题讨论】:
-
通常,单元测试的主要目标是确保代码按照外部调用者的方式运行。您应该能够在不破坏测试的情况下完全改变类的内部结构,只要它的行为方式相同。如果此代码的用户关心某些状态,他们应该有办法阅读它,并且您的测试应该使用该接口来检查状态是否正确。但更有可能的是,这些内部数据并不是您从构建测试中受益的东西。相反,您可以测试故障的外在症状。
-
谢谢,这是有道理的。是的,这个函数没有你描述的外部调用者。因此,对于我的用例,故障的外在症状可能是:在初始化一个新游戏后,采取了一个动作——如果棋盘上没有一个 X,是否意味着初始化失败?这样做的问题是错误可能来自两个来源:初始化函数或 makeMove 函数:也许这会使它成为集成测试与单元测试,对吧?
标签: javascript jquery unit-testing jestjs