【问题标题】:How to unit test a function that returns nothing (but assigns values to variables)?如何对不返回任何内容(但为变量赋值)的函数进行单元测试?
【发布时间】:2021-06-28 22:19:55
【问题描述】:

您如何对不返回任何内容但更改变量值的函数进行单元测试?

我浏览了很多 S.O.尝试寻找答案的问题;以下是一些稍微受过教育的猜测:

  1. 在 Jest 的 test() 中,运行该函数,然后检查是否有 variable = expectedValue
  2. 这个用例不需要单元测试,它是一个简单的变量赋值
  3. 专门重写函数,使其返回一些东西
  4. 如果不返回任何内容,则该函数不应该存在,只需将初始化代码放入父函数中即可

1 似乎是最好的答案; 2 可能是对的 - 我是新手,仍在弄清楚 究竟是什么 需要测试;对于某些用例,3 感觉有点过头了; 4 并不总是正确的,有时您只需要为了可读性而拆分功能即可。


我的具体用例:

initializeGameplayGame 函数中被调用。它不返回任何东西;它只是将一些变量设置为它们的开始条件(玩家 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


【解决方案1】:

我的理解是你不能测试内部变量值

但是,您应该使用它产生的“外部”结果进行单元测试。 因此,理论上您可以在重构期间更改函数的内部,而无需更改测试。

所以设置你的变量,运行你的函数并测试你的变量的更新值

【讨论】:

    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    相关资源
    最近更新 更多