1

asp.netmvcプロジェクトでアカウントコントローラーをテストしています。すべてのメソッドをテストし、コードカバレッジの結果を調べたところ、Initializeメソッドがカバレッジされていないことに気付きました。

このメソッドをテストするにはどうすればよいですか?

public class AccountController : Controller
{

    public IFormsAuthenticationService FormsService { get; set; }
    public IMembershipService MembershipService { get; set; }

    protected override void Initialize(RequestContext requestContext)
    {
        if (FormsService == null) { FormsService = new FormsAuthenticationService(); }
        if (MembershipService == null) { MembershipService = new AccountMembershipService(); }

        base.Initialize(requestContext);
    }

このテスト方法を試しましたが、エラーが発生しました。

           [TestMethod]
        public void Constructor_ReturnsController()
        {
            RequestContext requestContext = new RequestContext(new MockHttpContext(), new RouteData());
            AccountController controller = new AccountController
            {
                FormsService = null,
                MembershipService = null,
                Url = new UrlHelper(requestContext),
            };

            IController cont = controller;
            cont.Execute(requestContext);
        }

エラーメッセージ:

テストメソッドMVC3Project.Tests.Controllers.AccountControllerTests+AccountControllerTest.Constructor_ReturnsControllerが例外をスローしました:System.NotImplementedException:メソッドまたは操作が実装されていません。

4

1 に答える 1

1

ユニットテストで明示的に呼び出す必要があります。

[TestMethod]
public void AccountController_Initialize_Method_Should_WireUp_Dependencies()
{
    // arrange
    AccountController controller = new AccountController();

    // act
    controller.Initialize(null);

    // assert
    Assert.IsNotNull(controller.FormsService);
    Assert.IsNotNull(controller.MembershipService);
}

このInitialize方法を使用して依存関係を設定することは悪い習慣であることに注意してください。依存性注入を使用することをお勧めします。

public class AccountController : Controller
{

    public IFormsAuthenticationService FormsService { get; private set; }
    public IMembershipService MembershipService { get; private set; }

    public AccountController(IFormsAuthenticationService formsService, IMembershipService membershipService)
    {
        FormsService = formsService;
        MembershipService = membershipService;
    }

    ... actions
}

これで、お気に入りの依存性注入フレームワークをセットアップして、それらの依存性をコントローラーに注入できます。たとえば、Ninjectを使用すると非常に簡単です。Ninject.MVC3NuGetをインストールしてから、生成された~/App_Start/NinjectWebCommon.csファイル内でカーネルを構成します。

/// <summary>
/// Load your modules or register your services here!
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<IFormsAuthenticationService>().To<FormsAuthenticationService>();
    kernel.Bind<IMembershipService>().To<AccountMembershipService>();
}        

そして最後に、それらの依存関係を単体テストにモックして、それらに対する期待を定義することができます。

于 2012-09-17T18:04:46.433 に答える