2016-07-26 83 views
3

作为我的previous question的后续工作,我遇到了一个新的障碍:如何为工具箱中的函数生成存根(stub)?Matlab工具箱中的存根测试

我发现安迪坎贝尔的解决方案为非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 
... 

比方说,我想在文件2存根文件1。而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. 使用mfilename检查工具箱中的什么子集目录我不得不重新
  3. 生成文件夹结构,从过载文件夹
  4. 拷贝到新的工具箱系统
  5. 添加THI s至路径

运行测试

在拆卸

  • 删除临时文件夹
  • 移除路径
  • 我有条目没有实现这一点,似乎有点冗长知道在MATLAB中有一个Pathfixture已经。 指向其他工具箱指出他们如何解决这些问题也是受欢迎的。

    回答

    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框架)以便将测试特定行为导入测试。

    +1

    我看到,隐藏我的测试工具箱是不可能的。我的初衷是将file1.m的测试作为file1_test.m或其子文件夹放在它旁边。由于改变目前的布局并不是什么大不了的事情,我会继续这样做。 – Bort