2016-09-26 5 views
-2

CheckPassWord() 에 대한 테스트를 작성하고 있습니다. 내 userMangerMock에서 Expect 통화가 예상대로 작동하지 않는다고 가정합니다.예상 전화가 모의 작업을하지 않습니다

//CheckPassword returns true if the parameter matches to the exsting user. 
//Existing user is obtained by GetUser() by internal call 
    bool passWordMatch = userMangerMock.CheckPassword(userInfo.Id, userInfo.Password); 

checkpassword를() 내부적 인 getUser()를 호출 인 getUser 이후 ()() 나는 stubUser 내가 기대의 구현을 생각 반환하기로 결정 더 깊은 내부 호출을 필요로하는 충분하다. 다음 전화 var userInfo = userMangerMock.GetUser("TestManager");stubUser을 반환합니다. 하지만, CheckPassword() 전화 나는 stubUser이 반환되지 않으므로 테스트에 실패했다고 가정합니다.

다음 UT에 버그가 있으면 수정하십시오.

//Use TestInitialize to run code before running each test 
    [TestInitialize()] 
    public void MyTestInitialize() 
    { 
     CreateUser(); 
    } 
    private static IUser _stubUser; 

    public void CreateUser() 
    { 
     IUserFactory iUserFactory = new UserFactory(); 

     UserParams parameters = new UserParams(); 
     parameters.Password = "TestPassword123!"; 
     parameters.UserID = "TestManager"; 
     _stubUser = iUserFactory.CreateUser(parameters); 
    }  

    /// <summary> 
    ///A test for CheckPassword 
    ///</summary> 
    [TestMethod()] 
    public void CheckPasswordTest() 
    { 
     // !!! Below I've used WhenCalled() to show you that correct 
     // expectation is called based on argument type, just see in debugger 
     IUserManager userMangerMock = MockRepository.GenerateMock<IUserManager>(); 
     userMangerMock.Expect(x => x.GetUser(Arg<string>.Is.Anything)) 
        .WhenCalled((mi) => 
        { 
         Debug.WriteLine("IUserManager - string parameter"); 
        }) 
        .Return(_stubUser); 

     var userInfo = userMangerMock.GetUser("TestManager"); 

     bool passWordMatch = userMangerMock.CheckPassword(userInfo.Id, userInfo.Password); 
     userMangerMock.VerifyAllExpectations(); 

     Assert.AreEqual(true, passWordMatch); 
    } 

    /// <summary> 
    /// Returns true if password matches the user 
    /// </summary> 
    public bool CheckPassword(string userId, string password) 
    { 
     if (userId == null) 
     { 
      throw new ArgumentNullException("userId"); 
     } 

     IUser user = GetUser(userId); 
     if (user == null) 
     { 
      throw new UserManagementException(UserManagementError.InvalidUserId); 
     } 

     return (user.Password == password); 
    } 
+3

코드 - 그것은 결코 호출하지 mock을 제외한 모든 것. 단위 테스트 코드를 확인하고 테스트하려는 구현을 보여주십시오. –

+0

bool에서 명확하게 호출하는 CheckPassword passWordMatch = userMangerMock.CheckPassword (userInfo.Id, userInfo.Password); CheckPassword() 구현을 업데이트했습니다. – Srikanth

+0

userManagerMock.CheckPassword()가 mock 객체에서 메소드를 호출 중입니다. 이 시점에서 실제 코드를 호출하지 않습니다. – Pedro

답변

1

내가 테스트에서 발견 몇 가지가 :

var userInfo = userMangerMock.GetUser("TestManager");

: 수동으로 테스트 코드 자체 인 getUser()를 호출하기 때문에

userMangerMock.VerifyAllExpectations();

이 항상 전달합니다

이 확인 호출은 실제로 필요하지 않으므로 실제로 제거 할 수 있습니다.

단위 테스트는 하드 코드 된 모의 객체를 주장하기 때문에 어떤 가치도 제공하지 않는 것 같습니다.

var userInfo = userMangerMock.GetUser("TestManager"); 

    bool passWordMatch = userMangerMock.ChePassword(userInfo.Id, userInfo.Password); 

    Assert.AreEqual(true, passWordMatch); 

userInfo 경우 단위 테스트를 리팩토링 할 수있는 다음 스텁 객체 _stubUser에 대한 참조입니다 : 당신이 진짜 단위 테스트처럼 보이지 않는 게시 한

bool passWordMatch = userMangerMock.CheckPassword(_stubUser.Id, _stubUser.Password); 

Assert.AreEqual(true, passWordMatch);