ヌルです:Controller.Userは、私は私のコントローラのアクションメソッドに次のコードを持っているユニットテスト中に
if (User.Identity.IsAuthenticated)
{
// ...
}
正常に動作するようです。しかし、このアクションを呼び出す単体テストを実行すると、User
がヌルなので失敗しますか?
誰もがこれに対処する最善の方法を提案できますか?単体テストのためにこのコードを再構成する必要がありますか?
ヌルです:Controller.Userは、私は私のコントローラのアクションメソッドに次のコードを持っているユニットテスト中に
if (User.Identity.IsAuthenticated)
{
// ...
}
正常に動作するようです。しかし、このアクションを呼び出す単体テストを実行すると、User
がヌルなので失敗しますか?
誰もがこれに対処する最善の方法を提案できますか?単体テストのためにこのコードを再構成する必要がありますか?
おそらく、設定の一部としてUserプロパティを設定する必要があります。コントローラを作成するために使用されたControllerContext
経由のHttpContextBase
を嘲笑して、あなたのモックされたユーザを返すようにします。 ControllerContext
をControllerContext
プロパティに設定し、オブジェクトグラフを正しく設定していれば、User
が見つかります。 Controller
クラスの
User
プロパティは、現在のHttpContext
からコピーされます - あなたは、コンテキストを提供し、あなたのユニットテストで動作するように、このために適切にそこUser
を設定する必要があります。
のコードをWebリクエストの文脈の外側にある以外に実行すると、ユーザーはnullになります。メソッドのテストを直接実行しているようです。
2つのオプションがあります。
あなたの問題を最も速く解決するには、必ずしも最も持続可能な修正ではないが、実行しているウェブサイトを単体テストからWebRequestとして呼び出すだけです。
持続可能な修正は、コンテキスト依存のサーバー側の機能(例:User
)をモック/フェイクできる単一のクラスに集約することです。
編集
誰もがこれに対処するための最良の方法を提案することはできますか?単体テストのためにこのコードを再構成する必要がありますか?
最終回答は「はい」です。さらに重要なのは、長期的にはシステムの柔軟性や保守性が向上するためです。