2012-04-03 5 views
2

ヌルです:Controller.Userは、私は私のコントローラのアクションメソッドに次のコードを持っているユニットテスト中に

if (User.Identity.IsAuthenticated) 
{ 
    // ... 
} 

正常に動作するようです。しかし、このアクションを呼び出す単体テストを実行すると、Userがヌルなので失敗しますか?

誰もがこれに対処する最善の方法を提案できますか?単体テストのためにこのコードを再構成する必要がありますか?

答えて

3

おそらく、設定の一部としてUserプロパティを設定する必要があります。コントローラを作成するために使用されたControllerContext経由のHttpContextBaseを嘲笑して、あなたのモックされたユーザを返すようにします。 ControllerContextControllerContextプロパティに設定し、オブジェクトグラフを正しく設定していれば、Userが見つかります。 Controllerクラスの

2

Userプロパティは、現在のHttpContextからコピーされます - あなたは、コンテキストを提供し、あなたのユニットテストで動作するように、このために適切にそこUserを設定する必要があります。

2

のコードをWebリクエストの文脈の外側にある以外に実行すると、ユーザーはnullになります。メソッドのテストを直接実行しているようです。

2つのオプションがあります。

あなたの問題を最も速く解決するには、必ずしも最も持続可能な修正ではないが、実行しているウェブサイトを単体テストからWebRequestとして呼び出すだけです。

持続可能な修正は、コンテキスト依存のサーバー側の機能(例:User)をモック/フェイクできる単一のクラスに集約することです。

編集

誰もがこれに対処するための最良の方法を提案することはできますか?単体テストのためにこのコードを再構成する必要がありますか?

最終回答は「はい」です。さらに重要なのは、長期的にはシステムの柔軟性や保守性が向上するためです。

関連する問題