2016-01-03 32 views
0

我有一個m-file,有幾個測試定義爲本地函數。他們是從main函數調用:在Matlab中爲每個本地函數導入函數

function tests = main_function_test() 
    tests = functiontests(localfunctions); 
end 

我做斷言一些寬容,所以我需要在每個本地函數導入:爲了使形式的斷言

import matlab.unittest.constraints.IsEqualTo; 
import matlab.unittest.constraints.AbsoluteTolerance; 

verifyThat(testCase, actual, IsEqualTo(expected, ... 
     'Within', AbsoluteTolerance(0.00001))); 

是否可以只導入一次這些函數,以便它們可以在每個本地函數中重用?

+0

編號Per [文檔](http://www.mathworks.com/help/matlab/ref/import.html):'Scope是函數,函數不共享父函數的導入列表。如果MATLAB函數或腳本和任何本地函數中需要導入列表,則必須調用每個函數的導入函數。' – excaza

+0

謝謝@excaza,我沒有找到這個摘錄。你可以添加這個答案。除非存在一些詭計,否則我認爲這應該是公認的答案。 – jruizaranguren

回答

1

這是不可能的每the documentation

範圍是函數和函數不共享父功能的導入列表。如果MATLAB函數或腳本和任何本地函數中都需要導入列表,則必須調用每個函數的導入函數。

話雖這麼說,你可以使用eval的輸出從import(字符串單元陣列),但它的編碼習慣極差,我強烈建議反對這樣做。

function trialcode 
import matlab.unittest.constraints.IsEqualTo; 
import matlab.unittest.constraints.AbsoluteTolerance; 

importlist = import; 
sub1(importlist) 
end 

function sub1(L) 
for ii = 1:length(L) 
    estr = sprintf('import %s', L{ii}); 
    eval(estr); 
end 
disp(import) 
end 

同樣,這在技術上是可行的,但請不要這樣做。你幾乎不能控制進口(控制邏輯可能比隱式導入它們要長),調試困難,MATLAB的編譯器不可能優化,並使代碼非常不清晰。

1

你可以在這裏做兩件事。

  1. 使用verifyEqual功能(doc)來獲取你最有verifyThat的功能。請注意,該函數存在名稱值對的'RelTol''AbsTol'

  2. 定義特殊的本地函數來使用像import語句。這些將在文件中具有優先級,就像您期望從文件級導入一樣。

這看起來像這樣:

function tests = main_function_test() 
tests = functiontests(localfunctions); 
end 

function firstTest(testCase) 
testCase.verifyThat(actual, IsEqualTo(expected, ... 
     'Within', AbsoluteTolerance(0.00001))); 
end 

function testASecondThing(testCase) 
testCase.verifyThat(actual, IsEqualTo(expected, ... 
     'Within', RelativeTolerance(0.0005))); 
end 

% "import" functions 
function c = IsEqualTo(varargin) 
c = matlab.unittest.constraints.IsEqualTo(varargin{:}); 
end 
function t = AbsoluteTolerance(varargin) 
t = matlab.unittest.constraints.AbsoluteTolerance(varargin{:}); 
end 
function t = RelativeTolerance(varargin) 
t = matlab.unittest.constraints.RelativeTolerance(varargin{:}); 
end 

希望幫助!

+0

您的回答引發了我另一個選擇:在另一個名爲verify_almost_equal(testCase,actual,expected,tol)的文件中定義一個新的幫助函數,該函數將是唯一進行導入的文件。這樣我可以在多個測試文件中重複使用它。 – jruizaranguren