2017-09-18 19 views
0

我跨張貼這question I asked MATLAB的答案。如何在每次調用返回不同的輸出到模擬的方法


我想使用新的MATLAB嘲笑框架來測試計算圖像幀流的運行方差的類方法。該方法的輸入通常來自另一個數據類。我想這樣做是有每次被調用時返回一個正態分佈隨機幀進行模擬,然後有一個測試,檢查,看是否經過一些大量的幀,返回的方差爲1(內公差)。

如果我寫我的方法是這樣的:

function mock = makeMock(obj) 
     [mock, b] = createMock(obj, 'AddedMethods', {'r'}); 
     import matlab.mock.actions.AssignOutputs; 
     rng(1) 
     x = @() randn(obj.rows, obj.cols); 
     when(withAnyInputs(b.r), repeat(32, AssignOutputs(x()))); 
    end 

然後輸出分配時,randn評估和輸出是靜態的,所以我所有的幀是相同的。我試過的第二件事是要一次作爲列表中添加多個幀:

function mock = makeMock(obj) 
     [mock, b] = createMock(obj, 'AddedMethods', {'r'}); 
     import matlab.mock.actions.AssignOutputs; 
     rng(1) 
     x = num2cell(randn(obj.rows, obj.cols, 32), [1 2]); 
     when(withAnyInputs(b.r), AssignOutputs(x{:})); 
    end 

這仍然只給出第一幀,因爲AssignOutputsdeal S是其值的輸出變量,所以我總是隻請求第一個。

最後醜陋的東西我想是:

 when(withAnyInputs(b.r), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      then(AssignOutputs(randn(obj.rows, obj.cols)), ... 
      AssignOutputs(randn(obj.rows, obj.cols))) ... 
      ))))))))))))))))))))))))))))))); 

這給了我一個錯誤,說我嵌套太深。

我會注意到,我試圖測試方法,希望整個模擬對象作爲輸入,不只是框架,所以只是傳遞一個隨機幀是不可能的。這是一個非常非常大的代碼庫的一部分,因此簡單地重寫測試方法取幀直接,目前不可能沒有顯著重構一些其他的方面,所以我堅持做測試,現在這個樣子。

有一種優雅的方式做我想做的事?

回答

2

我張貼解答了MATLAB的答案: https://www.mathworks.com/matlabcentral/answers/357200-how-can-i-make-a-mock-method-return-different-answers#answer_282110

總結:

  • 有沒有乾淨的方式來做到這一點
  • 然而,一個可以建立在一個操作列表環

import matlab.mock.actions.AssignOutputs; 
[mock, b] = createMock(obj, 'AddedMethods', {'r'}); 
rng(1) 
n = 32; 
action = AssignOutputs(randn(obj.rows, obj.cols)); 
for i = 1:n-1 
    action = action.then(AssignOutputs(randn(obj.rows, obj.cols))); 
end 
when(withAnyInputs(b.r), action); 
相關問題