抽象クラスEntry,Exit,Filter,Stopのテスト <株入門>

話を戻して、抽象クラス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 まで。


社会・経済ニュース ブログランキングへ

にほんブログ村 海外生活ブログへ
にほんブログ村

カテゴリー: 株式投資, 株式投資入門はじめました2016.05 タグ: , , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*