2017-06-08 18 views
1

私は、可能ならばファイル内のコードを変更することなく、Bustedを使って既存のLuaファイルの単体テストを作成しています。このファイルは別のファイルをインポートし、そのファイルからさまざまなメソッドをローカル関数に格納します。Unit Luaでのローカル関数のテスト

[examplefile.lua] 
local helper = require "helper.lua" 
local helper_accept = helper.accept 
local helper_reject = helper.reject 

foo = new function() 
    -- do something which uses helper_accept 
    -- do something which uses helper_reject 
end 

私はこれらのメソッドをスパイして、正しい場所で呼び出したことを確認します。しかし、私はテストからこれを行うための方法を見つけることができません。 私はのように、単にヘルパーメソッドをからかってみた:

[exampletest.lua] 

local helper = require "helper.lua" 
local examplefile = require "examplefile.lua" 

-- mock the helper function to simply return true 
helper.accept = new function() return true end 
spy.on(helper, "accept") 
examplefile:foo 
assert.spy(helper).was().called() 

が、実際のファイルがhelper_acceptとhelper_reject方法、ないhelper.acceptとhelper.rejectを使用すると、それは動作しません。

コードを変更せずにこれを行うことはできますか?おかげさまで

+0

第ローカルファイルは、エクスポートされませんんだろう。しかし、helper.luaファイル全体をオーバーライドすることができるので、 'helper.accept'と' helper.reject'をロードするときに、あなたのフックされたバージョンの関数を使います。 – ktb

+0

@ktbそれは論理的な方法のように聞こえる。あなたがこれを行うのを助けるどんなドキュメンテーションを知っていますか? – Ryan

答えて

0

私がこれを達成するために考える最も簡単な方法は、フックスタブで "ヘルパー"ライブラリをオーバーライドすることです。これを行うには、package.loadedテーブルを変更します。 package.loadedテーブルには、require "lib"への最初の呼び出しの結果が格納されているため、同じrequireを再度呼び出すと、モジュールを再読み込みする必要はありません。 require "lib"への最初の呼び出しの前に何かを配置すると、ファイルシステムから実際にライブラリをロードすることはありません。

実際にはライブラリをロードしたいが、すべてのライブラリアクセスをフックすることができます。あなたがそれらを上書きすることはできませんので、私はこのような何かということ...

local lib = require "lib" 

local function hook_func(_, key) 
    print('Accessing "lib" attribute '..tostring(key)) 
    -- other stuff you might want to do in the hook 
    return lib[key] 
end 

package.loaded["lib"] = setmetatable({}, {__index = hook_func}) 
+0

これが完全に機能することを確認できます。あなたのすべての協力に感謝します。 – Ryan

関連する問題