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

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

我也看不到这个概念如何覆盖工具箱中的导入语句,例如在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正确完成此工作?

我知道,如果将另一条具有相同工具箱名称和功能的路径添加到该路径中,则可以在工具箱中隐藏该功能的实现。为此,我必须重新创建当前文件夹设置的子集:

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


tempdir创建临时文件夹
使用mfilename检查必须重新创建的工具箱目录的哪些子集
生成文件夹结构
从过载文件夹复制到新的工具箱系统
将此添加到路径


运行测试

在拆解中


删除临时文件夹
从路径中删除条目


我还没有实现它,并且知道在matlab中已经有一个Pathfixture似乎有点多余。
也欢迎指向其他工具箱的指针,这些工具箱显示了它们如何解决此类问题。

最佳答案

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

<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框架)以便将特定于测试的行为纳入您的测试中。

关于matlab - Matlab工具箱测试中的 stub ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38594491/

10-12 07:32