Matlab工具箱测试中的存根

时间:2016-07-26 15:48:25

标签: matlab unit-testing

作为我previous question的后续内容,我遇到了一个新的障碍:如何为工具箱中的函数生成存根?

我找到了安迪坎贝尔对非toolbox case的解决方案。这在我的情况下不起作用,因为Matlab抱怨:在Pathfixtures的MATLAB路径中不允许包目录!

我也没有看到这个概念如何覆盖工具箱中的import语句,例如:在file2。

这是我的设置:

+folder1/file1.m
+folder1/runtestsuite.m
+folder1/unittest_data/file1_testdata.mat
+folder1/+folder2/file2.m
+folder1/+folder2/unittest_data/overloads/file1.m
...

假设我想在file2中存根file1。 file2作为第一个语句:import folder1.file1

methods(Access=private)
        function inject_file1_stub(testCase, answer)
            import matlab.unittest.fixtures.PathFixture;
            testCase.applyFixture(PathFixture(fullfile(testCase.path,'overloads')));
            file1('', answer);
        end
    end

所以目前我认为这个概念在我的情况下不适用,那么如何用matlab正确完成呢?

我知道可以在工具箱中隐藏函数的实现,如果添加另一个具有相同工具箱名称和函数的路径。为此,我将不得不重新创建当前文件夹设置的子集:

所以我目前对夹具的想法是

  1. 使用tempdir
  2. 创建临时文件夹
  3. 使用mfilename检查我必须重新创建的工具箱目录的哪个子集
  4. 生成文件夹结构
  5. 从过载文件夹复制到新工具箱系统
  6. 将此添加到路径
  7. 运行测试

    在拆解中

    1. 删除临时文件夹
    2. 从路径中删除条目
    3. 我还没有实现这个,并且知道matlab中已经存在Pathfixture似乎有点多余。 指向其他工具箱的指针也显示了它们如何解决这些问题也是受欢迎的。

1 个答案:

答案 0 :(得分:1)

确实,您无法在路径中添加包的子文件夹,但这并不意味着您无法隐藏这些路径功能。为此,您需要将测试相关内容与源位置分开。例如,如果您的来源如下:

<source-home>/+folder1/file1.m
<source-home>/+folder1/+folder2/file2.m

然后你可以将你的测试放在其他地方,这样你的结构就像:

<test-home>/file1Test.m
<test-home>/file2Test.m % could also put tests into packages if you want
<test-home>/overloads/+folder1/file1.m
<test-home>/overloads/+folder1/+folder2/file2.m

然后在file1Test和/或file2Test内部使用PathFixture添加:

<test-home>/overloads/

到路径。

另外,要考虑的另一件事是在源代码中为这些依赖项定义一个接口,并利用dependency injection(带或不带DI框架),以便在测试中获得特定于测试的行为。