2012-02-07 4 views
1

このテストでは、顧客を作成し、Details()コントローラメソッドを呼び出してViewModelオブジェクトを返すことができるかどうかを確認します。ユニットテストコントローラメソッド - Initialize()を使用しないでベースクラスプロパティに値を代入

[TestMethod()] 
public void Can_View_AccountDetails() 
{ 
     AccountController target = new AccountController(null, null, null, null); 
     target.customer = new Customer { Id = 4, Active = true, BillingAddress_Id=1, ShippingAddress_Id=2 }; 

     // Act 
     ActionResult result = target.Details(); 
     // Assert 
     var resultData = ((ViewResult)result).ViewData.Model as AccountViewModel; 
     Assert.IsInstanceOfType(resultData, (typeof(AccountViewModel))); 
} 

'customer'はコントローラの基本クラスのメンバで、Initialize()で割り当てられます。最初は何も割り当てられませんでしたが、 'protected'ではなく 'public'に設定することで、テストで使用でき、基本クラスのInitialize()メソッドを呼び出そうとしませんでした。

EDIT: 'customer'は、基本クラスコンストラクタに挿入されたリポジトリオブジェクトからデータを取り込みます。

これは正しい方法ですか?テストを機能させるためにアクセシビリティレベルを変更するのはどういう意味か間違っているようです。

また、私はテストを作成するためにMoqを使用しようとしていますが、私は実際にここですべての嘲笑をしていません。

+0

AccountControllerまたはベースコントローラは、Customerインスタンス/顧客情報をどのように取得しますか? – BrokenGlass

+0

@BrokenGlass - 更新後に – markpsmith

+0

の編集を参照してください。顧客/リポジトリを基本クラスに挿入できますが、AccountControllerに挿入する方法はありますか?そのコードを表示できますか? – BrokenGlass

答えて

2

実際の問題は、お客様の情報が「魔法のように」AccountControllerに表示されていると思います。 Customerインスタンスは外部依存関係であるため、外部からAccountControllerに注入する必要があります。あなたがAccountControllerにあなた自身を渡すので、あなたはcustomerのプロパティをpublicにする必要はありません。

0

保護は、派生クラスからのみアクセスできることを意味するため、テストクラスは保護されたクラスを継承する必要があります。

また、これをMoqとしてスタブしましたが、モックテストは表示されません。 Customerクラスを表すインターフェイスを使用して、ICustomerインターフェイスをMockできるようにする必要があります。

0

リポジトリオブジェクトをスタブし、顧客を返すように設定する必要があります。

var repositoryStub = new Mock<IRepository>(); 
var customer = new Customer { /* ... */ }; 
repositoryStub.Setup(r => r.GetCustomer()).Returns(customer); 

そして当然、あなたはスタブとあなたのAccountContollerを初期化する必要があります:あなたは単にあなたが好きなものを返すために、リポジトリのスタブを教えて - その後、あなたはpublic(またはinternal)として.customerプロパティを公開する必要はありません。リポジトリへの依存性(aswellおよび他のもの、必要に応じて):

var accountController = new AccountController(repositoryStub, ...); 

このコースのは、あなたのAccountControllerがリポジトリ依存関係を取ることができ前提としています。

ベースクラスでInitialize()を呼び出すと、スタブ付きのリポジトリを使用し、プライベート.customerフィールドをスタブセットアップ中に戻るように設定する必要があります。

関連する問題