2012-06-27 5 views
0

저는 ASP.Net MVC2 프로젝트를하고 있고 그것에 대한 단위 테스트를하고 싶습니다. 내 LogOnController 테스트를 시도하고 몇 가지 어려움을 겪었습니다. 내 LogOnController에서 내가 MOQ의 framwork를 사용하고ASP.Net AccountMembershipService moq

AccountMembershipService MembershipService = new AccountMembershipService(); 

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

    } 

으로 나는 AccountMembershipService을 사용하고 난 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)); 

     } 

답변

0
  • 은 LogOnController에 AccountMembershipService를 주입한다.
    • 두 가지 종류의 주사가 있습니다. 하나는 생성자 주입과 다른 속성 주입입니다.
    • 다음은 생성자 주입을 보여줍니다.
      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)); 
} 

귀하의 문제는 재정의로 취급해야하므로, unoverridable 방법을 사용에서 비롯됩니다. 해결책 중 하나는 다음과 같은 가상 키워드를 추가하는 것입니다.

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

다른 것은 인터페이스를 정의하고 실제 AccountMembershipService 클래스 대신 인터페이스를 조롱합니다. 이렇게하려면 인터페이스를 사용하기 위해 DI (dependency injection)를 변경해야합니다.

public interface IUserValidator 
{ 
    void ValidateUser(string userName, string password) 
} 
public class AccountMembershipService : IUserValidator 
{ 
} 
+0

안녕하세요 ... 도와 주셔서 감사합니다. 생성자 주입에 대한 아이디어를 얻지 못했습니다. 그런데 전후에 프로퍼티 인젝션을 시도해 봤지만 .. 항상 다음과 같은 에러가 발생했습니다 .. "비 VB에서 오버라이드 가능한 멤버에 대한 설정이 잘못되었습니다 : x => x. ValidateUser (.validUserName, .validPassword) "를 입력하십시오. – Dilma

+0

가상 키워드를 추가하거나 인터페이스를 확장하고 인터페이스 구성원을 조롱하면 ValidateUser를 재정의 할 수 있습니다. –

+0

당신을 방해해서 죄송합니다 .. 몇 가지 코딩 예제를 게시 할 수 있었습니까. 나는 너의 친절을 정말 호소한다. 고맙습니다. (내 질문을 업데이트했습니다) – Dilma