2017-09-21 11 views
4

私は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を返す関数ではないようです。

+0

[私は急いで、後で回答を投稿することができます] ['assert'](https://www.lua.org/manual/5.3/manual.html#pdf-assert)を使用しますか?それは "サイレントエラー"を "大きなエラー"に変えます。 (そして、失敗の一般的なパターンは 'return nil、errmsg'ですが、' return false、errmsg'も同様です。) – nobody

+0

'assert'がエラーメッセージに行番号情報を追加するので、それはうまくいきませんでした。 Bustedは、divide_spec.lua:17:division by zeroが期待通りの "division by zero"と一致しないと言っています。 – hugomg

+0

次のような独自の 'assert'バリアントを書くことができます:' local function myassert(ok 、err) okならばokを返し、それ以外の場合はエラー(err)end end'を返します。 –

答えて

2

Bustedは、luassertを使用します。これは独自のアサーションで拡張できます。

たとえば、次のコードでは、最初のパラメータとして期待される結果のテーブルをとり、有効な関数の結果を残りのパラメータとするユーザー定義のアサーションanswersを使用します。

local assert = require "luassert" 

local 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 

local function answers(state, arguments) 
    local expected = arguments[1] 
    assert(type(expected) == "table") 
    for i = 2, #arguments do 
     if arguments[i] ~= expected[i-1] then 
      state.failure_message = "unexpected result " .. tostring (i-1) .. ": " .. tostring (arguments [i]) 
      return false 
     end 
    end 
    return true 
end 
assert:register("assertion", "answers", answers) 

describe("safe_divide", function() 
    it("can divide by positive numbers", function() 
     assert.answers({ 2.0 }, safe_divide(10.0, 5.0)) 
    end) 

    it("errors when dividing by zero", function() 
     assert.answers({ false, "division by zero" }, safe_divide(10.0, 0.0)) 
    end) 

    it("can divide by negative numbers", function() 
     assert.answers({ 2.0 }, safe_divide(-10.0, -5.0)) 
    end) 
end) 

このコードには、アサーションメッセージの正しい書式がありません。 luaassertのドキュメント、またはpredefined assertionsのドキュメントをご覧ください。それはメッセージの翻訳のためのsayモジュールを含んでいます。

+0

少しメモ。 'nil'とエラーメッセージをチェックする必要がある場合、このコードは動作しません。また、モジュールのカスタムメッセージを登録することも可能です。 – moteus

関連する問題