2011-01-20 11 views
0

これは私がVisual FoxProで達成しようとしているものです。個別の単体テストを作成するためにサブクラス化できる親UnitTestクラスを作成したいと思います。私は親のUnitTestがMainMethodを持って自分自身を調べ、それからすべてを見つけて実行することを期待しています。それは "test_"で始まる独自のメソッドです。VFPクラスは、実行時に独自のメソッドのコレクションを取得できますか?

このようにして、単体テストで適切な名前付き関数を書くことができます。親は、私からの追加の入力なしでそれらを実行する方法を知っています。しかし、私は実行時にこの情報をVFPから取得する方法を見つけることができません。子クラスがメソッド名のコレクションやそのことについて明示的に定義することはありません(まさに私が避けたいものです)。

ここにありますが、基本的なスタブです:

define class UnitTest as custom && would be abstract if VFP supported that 

    procedure MainMethod() 
     && run all methods that begin with test_ 
    endproc 

enddefine 

define class AUnitTest as UnitTest 

    procedure test_thingA() 
     ... 
    endproc 

    procedure test_thingB() 
     ... 
    endproc 

enddefine 

は、親から子メソッドで取得する方法について誰のアイデアを愛することになります。 (また、より良い実装アイデアに向かって、私はこの間違いを犯している場合、私は基本的なアイデアは私が行っているのは明らかだと思う)。

ありがとうございます!

答えて

2

AMEMBERS()関数を使用してメソッドのリストを取得できます。

 
loX = CREATEOBJECT("AUnitTest") 
loX.MainMethod() 
STORE .NULL. TO loX 
RETURN 


define class UnitTest as custom 

    procedure MainMethod() 
     LOCAL lcCommand, lcName, lcType, lnMemberNo, lnTotalMembers 
     LOCAL ARRAY laMembers(1) 

     m.lnTotalMembers = AMEMBERS(laMembers, THIS, 1, "U") 
     FOR m.lnMemberNo = 1 TO m.lnTotalMembers 
      m.lcName = m.laMembers[m.lnMemberNo,1] 
      m.lcType = m.laMembers[m.lnMemberNo,2] 

      IF (m.lcType == "Method") AND (LEFT(m.lcName, 5) == "TEST_") 
       m.lcCommand = "THIS." + m.lcName + "()" 
       &lcCommand 
      ELSE 
       * do nothing 
      ENDIF 
     ENDFOR 

    endproc 

enddefine 

define class AUnitTest as UnitTest 

    procedure test_thingA() 
     WAIT WINDOW "Testing Thing A" 
    endproc 

    procedure test_thingB() 
     WAIT WINDOW "Testing Thing B" 
    endproc 

    procedure NotATest() 
     WAIT WINDOW "Not A Test" 
    endproc 

enddefine 
+0

これはまさに私が探していたものです。ありがとうございました!完璧な作品 – goggin13

関連する問題