Тестовый метод все еще вызывает фактический метод, несмотря на макет - PullRequest
0 голосов
/ 02 сентября 2018

Итак, у меня есть некоторые начальные настройки, которые выглядят так:

    ILoginManager _loginManager;
    Mock<IValidations> _validations;
    Mock<IAccountRepository> _accountRepository;

    [SetUp]
    public void Setup()
    {
        _loginManager = new LoginManager();
        _validations = new Mock<IValidations>();
        _accountRepository = new Mock<IAccountRepository>();
    }   

Тогда у меня есть метод теста, который выглядит следующим образом:

    [Test]
    public void Login_ValidUser()
    {
        _validations.Setup(val => val.IsValidAccount(It.IsAny<User>())).Returns(true);
        _accountRepository.Setup(repo => repo.Login(It.IsAny<User>())).Returns(()=>new User());
        var result = _loginManager.Login(new User());
        Assert.That(result, Is.Not.Null);
    }

И фактический метод, который выглядит следующим образом:

    public User Login(User user)
    {
        if (user != null && _validations.IsValidAccount(user))
        {
            return _accountDal.Login(user);
        }
        log.Error("User null or not valid");
        return null;
    }

Проблема в том, что тестовый метод все еще вызывает исходные методы, поэтому он игнорирует настройку макета.

1 Ответ

0 голосов
/ 02 сентября 2018

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

Например

public class LoginManager : ILoginManager {
    private readonly IValidations _validations;
    private readonly IAccountRepository _accountDal;

    public LoginManager(IValidations validations, IAccountRepository accountDal) {
        _validations = validations;
        _accountDal = accountDal;
    }

    public User Login(User user) {
        if (user != null && _validations.IsValidAccount(user)) {
            return _accountDal.Login(user);
        }
        log.Error("User null or not valid");
        return null;
    }
}

Ваш текущий пример не использует макеты в тестируемом классе, потому что они не были введены.

Рефакторинг класса LoginManager и тест соответственно

ILoginManager _loginManager;
Mock<IValidations> _validations;
Mock<IAccountRepository> _accountRepository;

[SetUp]
public void Setup() {        
    _validations = new Mock<IValidations>();
    _accountRepository = new Mock<IAccountRepository>();
    _loginManager = new LoginManager(_validations.Object, _accountRepository.Object);
}   

[Test]
public void Login_ValidUser() {
    //Arrange
    var expected = new User();
    _validations.Setup(val => val.IsValidAccount(It.IsAny<User>())).Returns(true);
    _accountRepository.Setup(repo => repo.Login(It.IsAny<User>())).Returns(()=> user);

    //Act
    var actual = _loginManager.Login(expected);

    //Assert
    Assert.That(actual, Is.Not.Null);
    Assert.AreEqual(expected, actual);        
}
...