-2

我正在编写测试,因为CheckPassWord() 我认为 Expect 调用在我的 userMangerMock 上的行为不符合预期。

//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 我相信 Expect() 的实现就足够了。请注意,以下调用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);
    }
4

1 回答 1

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);
于 2016-09-26T09:04:23.027 回答