4

単一のモジュール関数に対して単体テストを作成しようとしています。このモジュールは他のいくつかのモジュールと連携するため、これらのモジュールをモックアウトして、テスト対象のシステムを分離したいと思います。簡略化した擬似コードを次に示します。

local moduleFoo={}
local moduleBaz=  require("moduleBaz") 

moduleFoo.doSomething = function (arg) 

  if moduleBaz.bar.neatMethod(arg) then
     --does something interesting  
  end

end

return moduleFoo

そして、これがmoduleBazのコードです

local moduleBaz={}
moduleBaz.bar= {}

moduleBaz.bar.neatMethod=function(arg)
   --does something neat
end
return moduleBaz

package.preload関数を使用して、テストを実行する前にmoduleBazのモックインスタンスを挿入しようとしていますが、機能していないようです(つまり、moduleBazの実際のインスタンスがテストで使用されており、モックではありません)

これがいくつかの疑似テストコードです:

    package.loaded.moduleBaz= nil
    local moduleBaz = {}
    moduleBaz.bar = {}
    moduleBaz.bar.neatMethod= function(guid) return true end

    package.preload['moduleBaz'] = function ()
        return moduleBaz
    end

   local foo= require("moduleFoo")
   foo.doSomething('asdasdasda')--real moduleBaz is called, not my mock!

私が間違っていることについて何か考えはありますか?私はLuaを初めて使用しますが、言語でスコープがどのように処理されるかについてはまったく満足していません。

4

1 に答える 1

8

moduleBazコードにreturnステートメントが欠落しているようです

return moduleBaz

package.loadedよりシンプルなインターフェースが得られるので、使ってみませんか?package.loaded.moduleBazコードから返したいものをすべて含める必要がありますmoduleBaz。このようなものが機能するか、あなたにアイデアを与えるはずです:

package.loaded.moduleBaz = {
  bar = {
    neatmethod = function(arg)
      -- your mock code here
    end,
  }
}

次にrequire('moduleBaz')、作成したオブジェクトを返すだけです。

私もあなたのセットアップで問題を再現することはできません。私が使用したファイルは以下のとおりです。return moduleBaz上記のように追加したことに注意してください。ただし、これが私が行った唯一の変更です。

ファイルmoduleBaz.lua

local moduleBaz={}
moduleBaz.bar= {}
moduleBaz.bar.neatMethod=function(arg)
  print "baz"
  return true
end
return moduleBaz

ファイルmoduleFoo.lua

local moduleFoo={}
local moduleBaz=  require("moduleBaz") 
  moduleFoo.doSomething = function (arg) 
  if moduleBaz.bar.neatMethod(arg) then
    print "foo"
  end
end
return moduleFoo

ファイルtestFoo.lua

package.loaded.moduleBaz= nil
local moduleBaz = {}
moduleBaz.bar = {}
moduleBaz.bar.neatMethod= function(guid) print "mock" return true end

package.preload['moduleBaz'] = function ()
    return moduleBaz
end

local foo= require("moduleFoo")
foo.doSomething('asdasdasda')--real moduleBaz is called, not my mock!

これを実行すると、mock\nfoo\n期待どおりに印刷されます。

于 2012-10-01T22:29:47.860 に答える