2012-11-09 4 views
0

MVC 컨트롤러를 테스트 중이며 내 저장소 중 하나에서 Save 메서드가 호출되는지 테스트하려고합니다. 컨트롤러는 사용자 등록을 시도하는 AccountController입니다. 내 AccountRepository에는 저장 및 등록이라는 두 가지 방법이 있습니다. 등록은 몇 가지 점검 후에 저장을 호출합니다. Register가 호출되는지 여부와 Register를 호출 할 때 Save가 호출되는지 또는 테스트에서 Moq를 잘못 설정했는지 여부를 확인하기 위해 저장소에서 별도의 단위 테스트를 실행해야하는지 잘 모르겠습니다.MVC 컨트롤러에서 메서드를 확인하기 위해 moq를 사용합니다.

[TestMethod] 
     public void register_post_saves_valid_registration() 
     { 
      _mockMemberRepository.Setup(r => r.GetByEmail(It.IsAny<string>())).Returns(_testMember); 

     // Arrange 
     RegisterViewModel model = new RegisterViewModel() 
     { 
      Email = "[email protected]", 
      Password = "test123", 
      ConfirmPassword = "test123" 
     }; 
     // Act 
     ActionResult result = _controller.Register(model); 
     // Assert 
     _mockMemberRepository.Verify(r => r.Register(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()), Times.Once()); 
     _mockMemberRepository.Verify(r => r.Save(It.IsAny<Member>()), Times.Once()); 
    } 

이 행 :

여기 내 테스트입니다

_mockMemberRepository.Verify(r => r.Register(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()), Times.Once()); 

이 테스트를 통과,하지만 아래의 라인을 소개 할 때 :

_mockMemberRepository.Verify(r => r.Save(It.IsAny<Member>()), Times.Once()); 

실패합니다.

public MembershipCreateStatus Register(string email, string password, string confirm) 
    { 
     if (password.Equals(confirm)) 
     { 
      try 
      { 
       Member m = GetByEmail(email); 
       if (m == null) 
       { 
        int format = (int)PasswordFormatEnum.Encrypted; 
        string salt = GenerateSalt(); 
        string pass = EncodePassword(password, format, salt); 

        m = new Member() 
        { 
         Email = email, 
         Password = pass, 
         PasswordSalt = salt, 
         PasswordFormat = format 
        }; 
        Save(m); 
        return MembershipCreateStatus.Success; 
       } 
       else 
        return MembershipCreateStatus.DuplicateEmail; 
       //"A user with that email address already exists. Please use the Forgotten Password link if you need to recover your password."; 
      } 
      catch (Exception ex) 
      { 
       _logger.LogError(ex); 
       return MembershipCreateStatus.ProviderError; 
      } 
     } 
     return MembershipCreateStatus.InvalidPassword; 
    } 

Save 방법은 단지 회원 객체를 취하고 무효 방법입니다 :

여기 내 저장소에 내 등록 방법입니다.

내가 뭘 잘못하고 있니?

+0

지금까지 '설정이 구성되지 않았습니다.'라는 오류 메시지가 나타납니다. – lloydphillips

답변

3

위의 코드에서 Save 메서드는 Register 메서드의 일부인 것처럼 보입니다. 이 경우 Register 메서드는 mockRepository의 일부이므로 조롱을받습니다. 따라서 저장을 호출하는 실제 구현은 절대로 호출되지 않습니다.

위의 가정 사실이다 (I가 생각하는,하지만 난 컨트롤러 코드를 가지고 있지 않기 때문에 정말 말할 수 없다), 별도의 테스트를 만들어야합니다

  1. 바로이 한 이제 저장 확인을 제거합니다.
  2. 저장소에 대한 단위 테스트이며 Register가 호출 될 때 Save가 호출되는지 확인하십시오.
+0

신난다, 고마워. 나는 그것이 사실일지도 모른다라고 생각했다. – lloydphillips

+0

안녕하세요, 지금 Repo에 저장 테스트에 문제가 있습니다. 나는 여기에 새로운 질문을 만들었습니다. http://stackoverflow.com/questions/13301351/using-moq-to-verify-a-method-is-called-in-a-repository – lloydphillips

관련 문제