あなたが欠いている主なことは、テスト用にASP.NET MVCプロジェクトを設計する方法の知識です。
依存関係注入を使用するようにコントローラを設計する必要があります。つまり、コントローラはAuthenticationServiceの具体的な実装を使用するべきではなく、IAuthenticationServiceを使用して、具体的な実装が実行時に提供されるようにします。今のところ、コントローラが作成されると、AuthenticationServiceも作成されます。しかし、テストシナリオでは、HttpContextはnullであり、AuthenticationServiceの作成はNullReference例外で失敗しています。あなたがインターフェイス経由で設計した場合、テスト目的でAuthenticationServiceの偽実装をコントローラに提供し、例外をスローしません。
public interface IAuthenticationService
{
IPrincipal User {get;}
}
public class AuthenticationService : IAuthenticationService
{
private IPrincipal _user = HttpContext.Current.User;
...
}
//the controller
[Authorize(Roles = "Administrador")]
public class ApuradorController : Controller
{
private readonly Questiona2011Context _context = new Questiona2011Context();
private readonly IAuthenticationService _authenticationService;
public ApuradorController(IAuthenticationService authenticationService)
{
_authenticationService = authenticationService;
}
}
は、テストシナリオでは、たとえばmoqのために、偽のIAuthenticationServiceの実装のためのいくつかのモックライブラリを使用することができます。そして、それを嘲笑して価値を提供してください。
var mockAuthenticationService = new Mock<IAuthenticationService>();
//setup mockAuthenticationService
var controller = new ApuradorController(mockAuthenticationService.Object);
今回は、例外をスローしません。
ユニットテスト可能なプロジェクトデザインの原則を理解していない場合は、上記の情報は役に立ちません。クイックスタートについては、thisリンクをご覧ください。さらなる読書のためには、asp.net mvcに関するアドレス帳、私はそれらをスティーブン・サンダーソンによって推奨するでしょう。ユニットテスト可能なコントローラー設計の主な考え方は、コントローラー、偽のリポジトリー、サービスなどに偽のコンポーネントを供給し、ユニットテストされたコントローラーの一部だけを残すことができるということです。次に、これらの偽の部品とコントローラの反復をテストします。単体テストとは、その相互作用をテストすることを意味します。インタラクションが正しい場合、これらのコンポーネントの実際の実装では正しいでしょう。それらが間違っていれば、テストは失敗します。
私はあなたの提案をしています:var authenticationService = new Mock(); varコントローラ=新しいApuradorController(authenticationService);しかし、私は例外を取得しています:引数型 'Moq.Mock は、パラメータ型' App.Services.IAuthenticationService 'に割り当てられません。 –
新しいApuradorController(authenticationService.Object)を使用する必要があります。 ? –
はい、あなたはそれを正確に行うべきです。また、そのモックApplicationServiceのUserプロパティを使用する場合は、Setup()を実行する必要があります。 moq documentation wikiのSetup()について読む - http://code.google.com/p/moq/wiki/QuickStart – archil