在Matlab中可以出现哪些方法关键字(即TestMethodSetup)?

时间:2014-11-03 08:56:47

标签: matlab oop annotations custom-attributes

Matlab提供了通过关键字在方法块中声明方法类型的可能性。

UnitTestingFramework使用了这个(Example):

methods(TestMethodSetup)
    function createFigure(testCase)
        % comment
        testCase.TestFigure = figure;
    end
end

我正在搜索methods()之间允许出现的关键字的完整列表。

我想知道这一点,能够为Spinx-Contrib Matlab域中的issue做出贡献。

2 个答案:

答案 0 :(得分:2)

对于常规课程,您可以记录以下attributes for classes

Abstract
AllowedSubclasses
ConstructOnLoad
HandleCompatible
Hidden
InferiorClasses
Sealed

for methods

Abstract
Access
Hidden
Sealed
Static

for properties

AbortSet
Abstract
Access
Constant
Dependent
GetAccess
GetObservable
Hidden
SetAccess
SetObservable
Transient

events

Hidden
ListenAccess
NotifyAccess

但也有一些undocumented attributes - for example以上任何一项也可以包含DescriptionDetailedDescription属性。这些在MATLAB编辑器中被标记为未知属性,但是完全可用(并且被许多内置类(如containers.Map)使用),编辑器标志可以用%#ok<ATUNK>来抑制。我经常使用它们来组合相关的方法/属性等。


matlab.unittest.TestCase添加了类属性:

SharedTestFixtures

方法属性:

Test
TestMethodsetup
TestMethodTeardown
TestClassSetup
TestClassTeardown
ParameterCombination

和属性属性:

ClassSetupParameter
MethodSetupParameter
TestParameter

您没有提及对它们的兴趣,但如果您为Sphinx做出贡献,您可能还想添加对System Objects的支持,这会添加属性属性:

Nontunable
Logical
PositiveInteger
DiscreteState

现在可能还有更多,而且我现在还没有注意到更多的无证attributes

答案 1 :(得分:2)

请注意,这些属性实际上只是元类,元属性,元方法等的属性。观察您可以看到给定方法(等)块的有效属性列表,如下所示:

>> cls = ?matlab.unittest.TestCase

    cls = 

      class with properties:

       SharedTestFixtures: {}
                 TestTags: {}
                     Name: 'matlab.unittest.TestCase'
              Description: 'Class which defines test cases in the MATLAB Unit Test Framework.'
      DetailedDescription: ''
                   Hidden: 0
                   Sealed: 0
                 Abstract: 1
              Enumeration: 0
          ConstructOnLoad: 1
         HandleCompatible: 1
          InferiorClasses: {0x1 cell}
        ContainingPackage: [1x1 meta.package]
             PropertyList: [2x1 meta.property]
               MethodList: [133x1 meta.method]
                EventList: [11x1 meta.event]
    EnumerationMemberList: [0x1 meta.EnumeratedValue]
           SuperclassList: [1x1 meta.class]

>> class(cls)

ans =

matlab.unittest.meta.class

>> method = cls.MethodList.findobj('Name', 'TestCase')

method = 

  method with properties:

                    Test: 0
         TestMethodSetup: 0
      TestMethodTeardown: 0
          TestClassSetup: 0
       TestClassTeardown: 0
    ParameterCombination: ''
                TestTags: {}
                    Name: 'TestCase'
             Description: ''
     DetailedDescription: ''
                  Access: 'protected'
                  Static: 0
                Abstract: 0
                  Sealed: 0
                  Hidden: 0
              InputNames: {0x1 cell}
             OutputNames: {'lhs1'}
           DefiningClass: [1x1 matlab.unittest.meta.class]

>> class(method)

ans =

matlab.unittest.meta.method

>> 

您可以看到这些具有额外属性的类实际上是新的元类,它们是标准元类的子类。那就是matlab.unittest.meta.class是meta.class的子类,matlab.unittest.meta.method是meta.method的子类。