私はfalse
を返し、エラーメッセージを返すLua関数を持っていて、bustedテストフレームワークを使用してその動作をテストしたいと考えています。今、私は少しこのようにそれをやっている:ok、errを返す関数のバーストユニットテストを書くにはどうすればよいですか?
function safe_divide(a, b)
if b > 0 then -- buggy! should be b ~= 0
return a/b
else
return false, "division by zero"
end
end
describe("safe_divide", function()
it("can divide by positive numbers", function()
local ok, err = safe_divide(10.0, 5.0)
assert.truthy(ok)
assert.are.same(2.0, ok)
end)
it("errors when dividing by zero", function()
local ok, err = safe_divide(10.0, 0.0)
assert.not_truthy(ok)
assert.are.same("division by zero", err)
end)
it("can divide by negative numbers", function()
local ok, err = safe_divide(-10.0, -5.0)
assert.truthy(ok)
assert.are.same(2.0, ok)
end)
end)
私は私の現在のアプローチについては好きではない2つの事があります。
- は、各テストではなく、単一のきれいなラインの3つのラインであります
- 3回目のテストに失敗した場合、破損しているとちょうど
false
が真実の値ではなく、「ゼロで割る」というエラーメッセージが表示されません。
これらの問題を回避するためにテストファイルを改善する方法はありますか?
私がしたいことは、has_error
アサーションと似ていますが、実際には例外を発生させる関数のように見えますが、エラーメッセージの後にfalse
を返す関数ではないようです。
[私は急いで、後で回答を投稿することができます] ['assert'](https://www.lua.org/manual/5.3/manual.html#pdf-assert)を使用しますか?それは "サイレントエラー"を "大きなエラー"に変えます。 (そして、失敗の一般的なパターンは 'return nil、errmsg'ですが、' return false、errmsg'も同様です。) – nobody
'assert'がエラーメッセージに行番号情報を追加するので、それはうまくいきませんでした。 Bustedは、divide_spec.lua:17:division by zeroが期待通りの "division by zero"と一致しないと言っています。 – hugomg
次のような独自の 'assert'バリアントを書くことができます:' local function myassert(ok 、err) okならばokを返し、それ以外の場合はエラー(err)end end'を返します。 –