話を戻して、抽象クラスEntry,Exit,Filter,Stopをテストする。
./check/rule_check.rb
Entryをテストするのに、簡単な子クラスを派生させ、
check_long_entry,check_short_entryを試す。
これによって、複雑な派生の構造が期待通りに動作することを確認する。
Exit,Filter,Stopも以下同様。
やってることはさほど難しくない。
ppというライブラリ使ってます。出力用の機能らしい。
クラスのインスタンスをputsではなく、ppで出力すると綺麗に改行されてる。
あと、Tradeの物理的なアドレスが最初に出力されますが、
それは実行時都度違う値なので関係ない。
しかし、目検止めてUnitTest使ってよ。
出力これだけ長いと、目で追うのは間違いやすい。
言及すべきことは、それくらい。
次回は、ようやく具体的なインジケータ利用したRuleの実装。
それだけじゃ、書くこと短すぎるので、脱線します。
しかし、株の話題じゃ全然ないなあ。
気になったのは、
UnitTestのassert_equalでは、クラスのインスタンス同士は比較できない。
ということです。
試してみましたが、ダメでした。
Rubyのインスタンス同士の比較では、
物理的なアドレスも比較してしまう。プロパティが全部同じならイコールと判断できない。
==を上書きするしかないみたい。Arrayで==を上書きしてるように。
今回は、Tradeの中身を一つ一つ確認するだけなので、
アクセサメソッドを全てassert_equalでチェックすればいいんですけど。
インスタンス同士で比較することもありそうです。
しかし、
テストでしか ==を使わないなら、本体のコードに手を入れるべきではない。
なので、ちょっとダサいけど、
TestCaseの方で、比較用のメソッド用意するしかないみたい。
逆にRubyに型チェックあると、もう少しスマートにオーバーロード出来るのに。。
ま、こんなコードを想定します。
以下はテストが全て合格します。
require ‘test/unit’
class DummyClass
attr_accessor :code, :market
def initialize(code, market)
@code = code
@market = market
end
end
class DummyClassTest < Test::Unit::TestCase
def dclass_equal(actual,expect)
(actual.code == expect.code) && (actual.market == expect.market)
end
def test_class
dclass1 = DummyClass.new(1,”aaa”)
dclass2 = DummyClass.new(1,”aaa”)
dclass3 = DummyClass.new(2,”aaa”)
dclass4 = DummyClass.new(1,”bbb”)
assert_not_equal(dclass1,dclass2)
assert( dclass_equal(dclass1,dclass2) )
assert(! dclass_equal(dclass1,dclass3) )
assert(! dclass_equal(dclass1,dclass4) )
end
end
質問コーナー、お問い合わせは、sanpome.net@gmail.com まで。