Можно ли использовать макет объекта в качестве входа для другого метода для макета? - PullRequest
0 голосов
/ 04 января 2019

Я создал предыдущий метод Test с настройкой для двух макетов объектов в одном доступе к данным, и он работал нормально.Сделал еще один с тем же сценарием, но это оказалось неудачным.

Вот метод теста:

[Test]
public void UpdateUserPassword_WhenInputsAreCorrect_ReturnsQuerySuccessMessage()
    {
        UpdatePasswordModel input = new UpdatePasswordModel()
        {
            UserName = "john.doe",
            NewPassword = "password1", //password1
            PreviousPassword = "password" //password
        };

        Mock<IUserDataAccess> user = new Mock<IUserDataAccess>();
        Mock<IDailyTimeInDataAccess> timeIn = new Mock<IDailyTimeInDataAccess>();
        Mock<IDailyTimeOutDataAccess> timeOut = new Mock<IDailyTimeOutDataAccess>();

        user.Setup(x => x.UpdatePassword(10000, input.NewPassword)).Returns("User record updated.");
        user.Setup(x => x.GetUser(input.UserName)).Returns(new User()
        {
            UserKey = 10000,
            UserName = "john.doe",
            UserPassword = "LTg9BIob8urwz643K5+pBA=="
        });

        ILoginBusinessRules app = new LoginBusinessRules(user.Object, timeIn.Object, timeOut.Object);

        var output = app.UpdateUserPassword(input);

        Assert.AreEqual("User record updated.", output);
    }

Вот бизнес-правило:

public string UpdateUserPassword(UpdatePasswordModel model)
    {
        if (model == null)
        {
            return "No data to process.";
        }
        if (string.IsNullOrEmpty(model.UserName))
        {
            return "Username is empty.";
        }
        if (string.IsNullOrEmpty(model.NewPassword))
        {
            return "New Password is empty.";
        }
        if (string.IsNullOrEmpty(model.PreviousPassword))
        {
            return "Previous Password is empty.";
        }

        var user = _userDataAccess.GetUser(model.UserName);
        if (user == null)
        {
            return "User not found.";
        }

        if (user.UserPassword != EncryptPassword(model.PreviousPassword))
        {
            return "Previous password does not match.";
        }
        else
        {
            user.UserPassword = EncryptPassword(model.NewPassword);
            user.UpdateDttm = DateTime.Now;
            user.UpdateUserId = model.UserName;

            var result = _userDataAccess.UpdatePassword(user.UserKey, user.UserPassword);

            return result;
        }
    }

Тест вернул aотказ.Дальнейшая отладка сказала мне, что эта строка возвращает нуль:

var result = _userDataAccess.UpdatePassword(user.UserKey, user.UserPassword);

Любая помощь с благодарностью!

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Setup использует input.NewPassword, что из теста равно

UpdatePasswordModel input = new UpdatePasswordModel() {
    //...
    NewPassword = "password1",
    //...
};

//...

user.Setup(x => x.UpdatePassword(10000, input.NewPassword)).Returns("User record updated.");

//...

, но в тестируемом методе метод вызывается с другим значением

//...

user.UserPassword = EncryptPassword(model.NewPassword);

//...

var result = _userDataAccess.UpdatePassword(user.UserKey, user.UserPassword);

, которое не соответствуетто, что ожидалось в настройке.

Когда надсмотренный член не вызывается с ожидаемым, он вернет тип возвращаемого значения по умолчанию, который в этом случае будет null

Вам нужно будет либо убедиться, что в ожидании настройки используется правильное значение

Например

user
    .Setup(x => x.UpdatePassword(10000, EncryptPassword(input.NewPassword)))
    .Returns("User record updated.");

, либо ослабить ожидание установки с помощью сопоставления аргументов, например It.IsAny<T>()

   user
    .Setup(x => x.UpdatePassword(10000, It.IsAny<string>()))
    .Returns("User record updated.");
0 голосов
/ 04 января 2019

Чтобы ответить на вопрос в посте, да, вы можете использовать любой объект, который соответствует типу ввода.Ваши коды на самом деле не знают разницу между «фиктивным» и «реальным» объектом.

...