0

ASP.Net MVC2プロジェクトを実行していて、そのプロジェクトでいくつかの単体テストを実行したいと思います。LogOnControllerをテストしようとしましたが、いくつかの問題に直面しました。LogOnControllerで、AccountMembershipServiceを次のように使用しました。

  AccountMembershipService MembershipService = new AccountMembershipService();

    if (MembershipService.ValidateUser(model.UserName, model.Password)){
    ............
    ..........

    }

MOQフレームワークを使用していますが、AccountMembershipServiceをモックする方法を知りたいです。正しいユーザー名とパスワードを指定しましたが、" MembershipService.ValidateUser(model.UserName, model.Password)"は常にfalseを返します。だからあなたの誰もがこれを行う方法についての考えを持っています。

ちなみに私はプロパティインジェクションを試しました。しかし、いつも次のエラーが発生しました。

"非仮想(VBでオーバーライド可能)メンバーの無効なセットアップ:x => x.ValidateUser(.validUserName、.validPassword)"。

それは、" stubService.Setup(x => x.ValidateUser(model.UserName, model.Password)).Returns(true);"行から来ます。

これが私のコードです。

[TestMethod]
         public void TestLogOn_ValidUserNameAndPassword()
         {
             var controller = new LogOnController();
             var request = new Mock<HttpRequestBase>(MockBehavior.Loose);
             var model = new LogOnModel();
             var context = new Mock<HttpContextBase>(MockBehavior.Loose);
             var stubService = new Mock<AccountMembershipService>();
             model.UserName = "xxxxx";
             model.Password = "123";
             context.SetupGet(x => x.Request).Returns(request.Object);
             controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller);
             stubService.Setup(x => x.ValidateUser(validUserName, validPassword)).Returns(true);

             Assert.IsTrue(stubService.Object.ValidateUser(model.UserName, model.Password));

         }
4

1 に答える 1

0
  • AccountMembershipServiceをLogOnControllerに注入します。
    • 注射には2種類あります。1つはコンストラクターインジェクションで、もう1つはプロパティインジェクションです。
    • 以下にコンストラクタインジェクションを示します。
public class LogOnController
{
    public LogOnController():this(new AccountMembershipService()){}
    public LogOnController(AccountMembershipService service){ ... } //ctor for injection
}
  • ValidateUserメソッドが仮想であることを確認してください。

    • モックするには、メソッドは仮想である必要があります。つまり、メソッドはインターフェース、抽象、または仮想です。
  • AccountMembershipServiceをモックして、テストを行います。

public void ExampleForMockingAccountMembershipService()
{
    var validUserName = "..";
    var validPassword = "..";
    var stubService = new Mock<AccountMembershipService >();
    stubService.Setup(x=>x.ValidateUser(validUserName,validPassword)).Return(true);

    Assert.IsTrue(stubService.Object.ValidateUser(validUserName, validPassword));
}

問題はオーバーライド不可能なメソッドの使用に起因するため、オーバーライド可能として扱う必要があります。解決策の1つは、次のような仮想キーワードを追加することです。

public class AccountMembershipService 
{
    ...
    public (virtual) bool ValidateUser(string userName, string password)
    {
        ...
    } 
    ...
}

もう1つは、実際のAccountMembershipServiceクラスの代わりに、インターフェイスを定義してインターフェイスをモックすることです。これを行うには、インターフェイスを使用するようにDI(依存性注入)も変更する必要があります。

public interface IUserValidator
{
    void ValidateUser(string userName, string password)
}
public class AccountMembershipService : IUserValidator
{
}
于 2012-06-27T14:46:16.930 に答える