0

現在、Busted を使用して lua mod ライブラリの単体テストを作成しています。問題のファイルは、いくつかの関数を含むモジュールを定義し、最後にそれらの関数の 1 つを呼び出して自身を初期化します。

私が見つけた問題は、Busted が必要なファイルを 2 回評価しているように見えることです。

テスト

it('does a thing', function()
    -- Some setup, replacing globals etc
    require('items')
    assert.are_equal(2, #Items._registry)
end)

モジュール

Items = { _registry = {} }
function Items.do_some_stuff() end
function some_util_func() end
function load_registry()
  print(debug.traceback())
  for i, itm in pairs(Items.do_some_stuff()) do
    Items._registry[i] = itm
  end
end

load_registry()

ご覧のとおり、コードと名前を単純化しましたが、構造は突然ではありません (私が理解しているように)。

は常に 0であるため、テストは常に失敗し#Items._registryます (コンソールへのダンプによってそれが検証されます)。メソッド内で印刷を試みたところ、2 回印刷されていることがわかりました。次にdebug.traceback、その関数の上部で使用してみましたが、以下が見つかりました。ご覧のとおり、スタック トレースバックが 2 回出力されており、コードが 2 回評価されていることを示唆しています。

これは他の誰かが遭遇したものですか?このシナリオでは、テストの構造が間違っていますか? それともこれはバグですか?


stack traceback:
    items.lua:96: in function 'load_registry'
    items.lua:109: in main chunk
    [C]: in function 'require'
    spec/items_pec.lua:50: in function <spec/items_spec.lua:39>
    [C]: in function 'xpcall'
    /usr/local/share/lua/5.2/busted/core.lua:178: in function 'safe'
    /usr/local/share/lua/5.2/busted/init.lua:40: in function 'executor'
    /usr/local/share/lua/5.2/busted/core.lua:312: in function </usr/local/share/lua/5.2/busted/core.lua:312>
    [C]: in function 'xpcall'
    /usr/local/share/lua/5.2/busted/core.lua:178: in function 'safe'
    ...
    /usr/local/share/lua/5.2/busted/core.lua:312: in function 'execute'
    /usr/local/share/lua/5.2/busted/block.lua:155: in function 'execute'
    /usr/local/share/lua/5.2/busted/init.lua:7: in function 'executor'
    /usr/local/share/lua/5.2/busted/core.lua:312: in function </usr/local/share/lua/5.2/busted/core.lua:312>
    [C]: in function 'xpcall'
    /usr/local/share/lua/5.2/busted/core.lua:178: in function 'safe'
    /usr/local/share/lua/5.2/busted/core.lua:312: in function 'execute'
    /usr/local/share/lua/5.2/busted/execute.lua:58: in function 'execute'
    /usr/local/share/lua/5.2/busted/runner.lua:174: in function </usr/local/share/lua/5.2/busted/runner.lua:11>
    /usr/local/lib/luarocks/rocks/busted/2.0.rc12-1/bin/busted:3: in main chunk
    [C]: in ?
stack traceback:
    items.lua:96: in function 'load_registry'
    items.lua:109: in main chunk
    [C]: in function 'require'
    spec/items_spec.lua:15: in main chunk
    [C]: in function 'xpcall'
    /usr/local/share/lua/5.2/busted/core.lua:178: in function 'safe'
    /usr/local/share/lua/5.2/busted/block.lua:146: in function 'execute'
    /usr/local/share/lua/5.2/busted/init.lua:7: in function 'executor'
    /usr/local/share/lua/5.2/busted/core.lua:312: in function </usr/local/share/lua/5.2/busted/core.lua:312>
    [C]: in function 'xpcall'
    /usr/local/share/lua/5.2/busted/core.lua:178: in function 'safe'
    /usr/local/share/lua/5.2/busted/core.lua:312: in function 'execute'
    /usr/local/share/lua/5.2/busted/execute.lua:58: in function 'execute'
    /usr/local/share/lua/5.2/busted/runner.lua:174: in function </usr/local/share/lua/5.2/busted/runner.lua:11>
    /usr/local/lib/luarocks/rocks/busted/2.0.rc12-1/bin/busted:3: in main chunk
    [C]: in ?
4

1 に答える 1

1

この質問への答えは、私が無関係だと思っていた詳細にありましたが、そうではありませんでした (私のコメントを参照してください)。

特に、モジュールのロード時の動作のテストを、さまざまな機能のテストから分離しました。特定のテストを対象として実行している場合でも、busted -tテスト中のモジュールのインポートは両方の仕様で評価されていました。require呼び出しがsetupルートdescribeブロックの関数に配置された場合でも。

2 つの仕様をマージすることで、この二重読み込みを回避することができました。

于 2016-09-07T15:47:42.643 に答える