2016-09-26 16 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は()私は期待()の実装は、そのために十分であると考えていstubUser を返すことを決めた、より深い内部コールを必要とするので、内部GETUSER()、 を呼び出します。 次のコール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

- それは呼び出すことはありませんモック以外のものユニットテストコードを確認し、テストしようとしている実装も表示してください。 –

+0

boolで明示的に呼び出すCheckPassword passWordMatch = userMangerMock.CheckPassword(userInfo.Id、userInfo.Password); CheckPassword()の実装を更新しました。 – Srikanth

+0

userManagerMock.CheckPassword()がmockオブジェクトのメソッドを呼び出しています。その時点で実際のコードは呼び出されていません。 – Pedro

答えて

1

私はあなたのテストに気づい物事のカップル:

userMangerMock.VerifyAllExpectations();

手動テストコード自体にGETUSER()を呼び出しているので、これは常に通過します:

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

実際にこの確認呼び出しを削除する必要はないので、この呼び出しを削除することができます。

あなたのユニットテストは、ハードコーディングされたモックオブジェクトをアサートしているので、あなたにとって価値があるとは思われません。

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); 
関連する問題