2017-09-18 4 views
0

私はこのquestion I askedをMATLAB Answersでクロスポストしています。モックメソッドを呼び出すたびに異なる出力を返す方法


私は、画像フレームのストリームの実行中の分散を計算クラスのメソッドをテストするために、新しい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が評価され、出力は静的なので、私のすべてのフレームは同じです。私が試した2つ目はリストとしてすべてを一度に複数のフレームを追加しました:

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は、出力変数にその値をよ、と私はいつものみを要求していますので、これはまだ最初のフレームだけを与えます最初の1つ。

私が試した最後の醜いものでした:

 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

を要約すると:

  • しかし、この
  • を行うにはクリーンな方法はありません、1はAでアクションのリストを構築することができますがループ

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); 
関連する問題