2016-11-23 5 views
2

と嘲笑オブジェクトから実際のオブジェクトを返す方法:のは、私はこの嘲笑された方法があるとしましょう部品番号

public Comfirmation AddCustomer(Customer customer) 
{ 
    // add customer to the Database 
    return confirmation; 
} 

そして、私のモックは、このようなものです:

_service 
.Setup(x =>x.AddCustomer(It.IsAny<Customer>)) 
.Returns(new Confirmation()); 

どのようにすることができます私は実際のメソッドから確認オブジェクト/状態を取得しますか? 私は嘲笑の目的は、コードの動作に影響を与える外部要因を分離することですが、実際の方法の計算結果を得る必要があることを知っています。この結果はテストの他の部分で使用されるためです。

+0

あなたの特定の問題を明確にしたり、必要な正確に何を強調表示するために、追加の詳細情報を追加してください。それが現在書かれているとして、それはあなたが求めている正確に何を伝えるのは難しいです。掲載して[方法を参照してください](http://stackoverflow.com/help/how-to-ask)ページを参照してください。 – Nkosi

答えて

1

MoqはクラスのAddCustomer機能を実行しません。したがって、現在のMoqセットアップではConfirmationオブジェクトを取得する方法はありません。つまり、AddCustomerの実際の実装が作成されている可能性があります。

別のテストの入力としてConfirmationが必要な場合は、の部分をテストの一部に配置してテスト中のメソッドの入力パラメータを作成します。

あなたがAddCustomer関数を呼び出すことによって、この問題にアプローチした場合は、Confirmation作成コードと確認を使用しているコードのカップリングを作成します。作成コードが変更された場合、テストは他の領域で破損する可能性があります。のデバッグは困難で時間がかかる可能性があります。

ソフトウェアの2つの部分のこの相互作用をテストする必要があるため、統合テストではこのカップリングが適切です。ユニットテストでは、AddCustomerの機能を他の部分から切り離すことを推奨します。

もう1つの方法は、AddCustomer機能が作成されているかもしれないConfirmationオブジェクトを作成することです。これは手動またはより複雑なオブジェクトのためにいくつかのキャプチャ/リプレイ手法(例えば、オブジェクトをXMLまたはJSON関数にシリアル化し、静的なXMLまたはJSONを解析することによって他のテストで模擬用オブジェクトConfirmationを作成するデシリアライザによって文字列。例:

string capturedJson = "...."; // <= JSON of a Confirmation object 
var confirmation = JsonConvert.DeserializeObject<Confirmation>(capturedJson); 
_service 
    .Setup(x =>x.AddCustomer(It.IsAny<Customer>)) 
    .Returns(confirmation); 

target.SomeConfirmationObjectUsingFunction(_service); 
+0

はい、これは正しいです。オブジェクトの状態をシリアライズするのが最善の方法でしょう。あなたは書かれたユニットテストコードをしようとするユニットテストの概念はありません。 –

関連する問題