我正在尝试创建一个参数化的Matlab单元测试,其中Iterator::operator[]
属性由某些代码“动态”生成(例如,使用Array::operator[]
循环)。
作为简化示例,假设我的代码是
TestParameter
但在我的真实代码中,我有100个级别。我试着把它放在一个单独的方法中,比如
for
但这不起作用;我得到了错误(Matlab 2014b):
classdef partest < matlab.unittest.TestCase
properties (TestParameter)
level = struct('level1', 1, 'level2', 2, 'level3', 3, 'level4', 4)
end
methods (Test)
function testModeling(testCase, level)
fprintf('Testing level %d\n', level);
end
end
end
我可以将classdef partest < matlab.unittest.TestCase
methods (Static)
function level = getLevel()
for i=1:100
level.(sprintf('Level%d', i)) = i;
end
end
end
properties (TestParameter)
level = partest.getLevel()
end
methods (Test)
function testModeling(testCase, level)
fprintf('Testing level %d\n', level);
end
end
end
函数移动到另一个文件,但我想将它保存在一个文件中。
答案 0 :(得分:4)
在这里(R2015b),它看起来像TestParameter
属性无法使用静态函数调用初始化...
幸运的是,解决方案非常简单,请改用local function:
classdef partest < matlab.unittest.TestCase
properties (TestParameter)
level = getLevel()
end
methods (Test)
function testModeling(testCase, level)
fprintf('Testing level %d\n', level);
end
end
end
function level = getLevel()
for i=1:100
level.(sprintf('Level%d', i)) = i;
end
end
(请注意,以上所有代码都包含在一个文件partest.m
)中。
现在这应该有效:
>> run(matlab.unittest.TestSuite.fromFile('partest.m'))
注意强>:
作为一个本地函数,它不会在课外看到。如果您还需要公开它,只需添加一个静态函数作为一个简单的包装器:
classdef partest < matlab.unittest.TestCase
...
methods (Static)
function level = GetLevelFunc()
level = getLevel();
end
end
end
function level = getLevel()
...
end