2016-07-26 84 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