VFP类可以在运行时获取它自己的方法的集合吗?

时间:2011-01-20 19:43:38

标签: unit-testing visual-foxpro

这是我在Visual FoxPro中想要实现的目标。我想编写一个父UnitTest类,它可以被子类化以创建单独的单元测试。我希望父UnitTest可以有一个MainMethod检查自己,然后查找并执行所有以“test_”开头的方法。

通过这种方式,我可以在单元测试中继续编写适当命名的函数,并且父级将知道如何运行它们而无需我的任何额外输入。但是,我无法找到任何方式在运行时从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

会喜欢任何人关于如何从父母那里获得孩子方法的想法。 (对于一个更好的实现想法也是开放的,如果我发生了这个错误,我认为我想要的基本想法是明确的。)

提前非常感谢!

1 个答案:

答案 0 :(得分: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