MOCKを使用したパラメータがMOQで各呼び出しを出力した場合の出力方法 -- c# フィールド と unit-testing フィールド と testing フィールド と moq フィールド と out フィールド 関連 問題

Have mocked method output different out param each call with MOQ












1
vote

問題

日本語

MOQがメ​​ソッド上でシーケンシャルコールを持つような方法は、異なる<コード> out パラメータを返しますか? すぐにメソッドの取得の手順については、

<事前> <コード> public void OutputANumber(out int number)

出力1に続いて2( int が返される可能性があるという事実を無視して、例は実際のコードではありません)。

<事前> <コード> int number = 1; mock.Setup(n => n.OutputANumber(out number)); number = 2; mock.Setup(n => n.OutputANumber(out number));

は、2番目のセットアップが最初に上書きされているので機能しません。 SetupSequence は、順次収納を可能にします。

英語

Is there a way with MOQ to have sequential calls on a method return different out parameters? For a quick example getting the method:

public void OutputANumber(out int number) 

to output 1, followed by 2 (ignore the fact it could return int, it's for an example only not real code).

int number = 1; mock.Setup(n => n.OutputANumber(out number)); number = 2; mock.Setup(n => n.OutputANumber(out number)); 

Doesn't work as the second setup overrides the first, likewise a SetupSequence only allows for sequential returns.

</div
              

回答リスト

1
 
vote

1つの解決策は、コールバックを使用して、MOCKを新しいセットアップを実行する方法に渡すことです。 <事前> <コード> class App extends Component(){}5

または電話回数を追跡し、必要に応じて新しい値を出力するダミーオブジェクトを作成することができます。

 

One solution is to use a callback to pass the mock into a method that runs a new setup like so

int number = 1; mock.Setup(n => n.OutputANumber(out number)).Callback(() => ChangeOut(mock));  void ChangeOut(Mock<type> mock) {     int number = 2;     mock.Setup(n => n.OutputANumber(out number)); } 

or you could create a dummy object that tracks the number of calls and outputs a new value as needed.

</div
 
 
0
 
vote

順次呼び出しだけを必要とする場合は、

Lukewのソリューションが発生する可能性があります。しかし、より長いシーケンスでそれは複雑すぎる可能性があります。 typeMock Isolator にはるかに簡単に解決できます。下の例を見てください。

<事前> <コード> @Table(name = "Customer", catalog = "")16

ダミーオブジェクトまたは追加のメソッドを作成する必要はありません。 PARAMを定義し、ISOLETATOLED()を使用してシリアルを定義します。

<事前> <コード> class App extends Component(){}7

isolate.whencalled()の最後の呼び出しは、その瞬間以降のメソッドのデフォルトの動作を定義します。したがって、例では、偽の呼び出し後に呼び出される元の実装を返しました。

<事前> <コード> class App extends Component(){}8

 

LukeW's solution can work out, if you need just two sequential calls. But with longer sequence it can become too complex. You can solve it much easier with Typemock Isolator. Take a look on the example below:

public class ClassUnderTest {     public void OutputANumber(out int number)     {         number = 3;     } }  [TestMethod, Isolated] public void TestOutSequence() {     //Arrange     var n = new ClassUnderTest();      int number = 1;     Isolate.WhenCalled(() => n.OutputANumber(out number)).IgnoreCall();     number = 2;     Isolate.WhenCalled(() => n.OutputANumber(out number)).IgnoreCall();     Isolate.WhenCalled(() => n.OutputANumber(out number)).CallOriginal();      //Act     var res1 = 0;     var res2 = 0;     var resOriginal = 0;     var resDefault = 0;     n.OutputANumber(out res1);     n.OutputANumber(out res2);     n.OutputANumber(out resOriginal);     n.OutputANumber(out resDefault);      //Assert     Assert.AreEqual(1, res1);     Assert.AreEqual(2, res2);     Assert.AreEqual(3, resOriginal);     Assert.AreEqual(3, resDefault); } 

No need to create a dummy objects or additional methods. By serial defining out param and using Isolate.WhenCalled() you can set up any sequence of out parameters:

int number = 1; Isolate.WhenCalled(() => n.OutputANumber(out number)).IgnoreCall(); 

The last call to Isolate.WhenCalled() defines the default behavior for the method from that moment onwards. So, in the example I returned the original implementation to be called after fake calls:

Isolate.WhenCalled(() => n.OutputANumber(out number)).CallOriginal(); 
</div
 
 

関連する質問

0  Oracleストアドプロシージャを使用して、マルチダイメインの配列をOUTパラメータとして送信する  ( Send multidimensional array as out parameter using oracle stored procedure ) 
この問題の下で私を助けてください、 Oracleストアドプロシージャーに多次元配列を作成できますか?もしそうなら、あなたは例を例に説明してもらえますか? オラクルストアドプロシージャからパッケージをパラメータとして送信することができますか? 私を助...

1  ファイル名、ディレクトリ名、またはボリュームラベルの構文が正しくありません  ( The filename directory name or volume label syntax is incorrect ) 
私はいくつかのsvnコマンドを実行する必要がある単純なPython(2.7)スクリプトを持っています: <事前> <コード> def getStatusOutput(cmd): print cmd p = subprocess.Popen([c...

0  インストールMaven Eclipse 3.8接続リポジトリエラーのタイムアウト  ( Installation maven eclipse 3 8 time out connection repository errors ) 
をインストールしました <事前> <コード> Eclipse Platform Version: 3.8.1 Build id: M20120914-1540 と私はMavenをインストールしたいです。 ステップ: <事前> <コード> Help->In...

1  cpanel - public_htmlの外のサブドメイン  ( Cpanel subdomain outside public html ) 
CPanelによって管理されている1つのホスティングアカウントに2つのドメインを持っていました。 2番目のドメインのインストール中に、2番目のサイトが最初のドメインの1つともまったく関係なく独立したFTP管理を持つことになっているため、PUBLIC_HTML...

0  エクセルでセントを削除するときに「セントなし」を削除する方法は?  ( How to remove no cents when spelling out cents less dollar figures in excel ) 
私はExcelのドル番号を完璧に綴ることができています。しかし、私が望んでいないのは、「セントなし」を綴るときです。だから私が24030を綴ったかったのであれば言ってみましょう。それは24,4000ドルとセントなしで言うでしょう。 Excelは、存在する場合に...

4  "OUT"パラメータを持つtryxxxのようなメソッドvs nullable値タイプを返す?  ( Tryxxx like methods with out parameters vs returning a nullable value type ) 
私はC#でこのような方法を見ることがよくあります。(結果を与えるかもしれないまたは結果を与えないかもしれない計算をしている) <事前> <コード> bool TrySomething(SomeType inputData, out SomeOtherType ...

0  Ruby Mechanize接続がタイムアウトしました  ( Ruby mechanize connection timed out ) 
メカイズとノコギリを使って多数のルビースクレーパーを作成してきました。たとえば、(ただし、一定数の要求(この場合は約14000)が表示されているというエラーが発生したエラーが発生しました: /var/lib/gems/1.8/gems/net-http-pe...

0  プログラム効率とjava.lang.outOfMemoryError:Javaヒープスペース  ( Program efficiency and java lang outofmemoryerror java heap space ) 
最後のものが残るまで、2番目の要素をすべて削除することです。 (要素が円に配置されていると仮定) 私のプログラムはnの小さい値でうまく機能しますが、大きな値を使用すると<コード> java.lang.OutOfMemoryError: Java heap sp...

11  出力パラメータを使用して.NETメソッドを呼び出す方法  ( How to call a net method with an output parameter ) 
generateScript メソッド PowerShellからMicrosoft.Data.Schema.ScriptDod.SQL100ScriptGenerator <事前> <コード> #C public void GenerateScript...

1  範囲外のインデックス(Python)  ( Index out of bounds python ) 
私は集約したいデータをいくつか持っていますが、私は範囲の範囲外のエラーの範囲外であり、なぜ理解してもらえないようです。これが私のコードです: <事前> <コード> if period == "hour": n=3 tvec_a=np.zeros...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有