Почему операция добавления не работает на макете? - PullRequest
2 голосов
/ 28 апреля 2020

Итак, я снова пытаюсь использовать другой контроллер для тестирования настольного приложения Cocoa с использованием NUnit и Moq. Проблема в том, что даже после операции .add () у меня все еще нет того, что я только что добавил, используя макет. Точнее, вот как я делаю макет:

User user = new User
            {
                email = "test@gmail.com",
                password = "1",
                firstName = "Test",
                lastName = "Test"
            };
List<User> dataSource = new List<User>();
var userServiceMock = new Mock<IUserService>(MockBehavior.Strict);
userServiceMock.Setup(x => x.add(It.IsAny<User>()));
userServiceMock.Setup(x => x.getAllUsers()).Returns(dataSource);

var controller = new CreateAccountCoreController(userServiceMock.Object);

 //act
controller.submit();

//assert
Assert.That(dataSource.Contains(user));

, а в контроллере это так:

readonly IUserService userService;
public CreateAccountCoreController(IUserService userService) 
{
    this.userService = userService;
}

public  void submit()
{

User user = new User
            {
                email = "test@gmail.com",
                password = "1234",
                firstName = "Test",
                lastName = "Test",
            };
            userService.add(user);
            List<User> users = userService.getAllUsers();
/*users it is empty here..*/

}

Так что мой тест всегда не проходит, потому что в списке пользователей он пуст даже после .адд операции. Можете ли вы помочь, пожалуйста?

1 Ответ

5 голосов
/ 28 апреля 2020

Нет места, где вы можете заполнить коллекцию dataSource и настроить свой макет так, чтобы он возвращался из макета getAllUsers(). Таким образом, вы всегда получите пустую коллекцию из метода.

Используйте Callback() метод для настройки ожидаемого поведения:

userServiceMock.Setup(x => x.add(It.IsAny<User>())).Callback((User u) => dataSource.Add(u));

Вторая проблема может заключаться в сравнении пользователи в методе Contains(). Вам нужно сказать Contains, что делает двух пользователей равными. По умолчанию он будет использовать ReferenceEquals, который вызовет два равных объекта, только если они являются одним и тем же экземпляром.

Либо переопределите Equals и GetHashCode в вашем классе User, либо определите IEqualityComparer<User> Класс и передать это Contains.

Если два пользователя с одинаковыми email "равны", то реализация довольно проста:

public override bool Equals(object o)
{
   if(o.GetType() != typeof(User))
     return false;

   return this.email == ((User)o).email;
}

public override int GetHashCode()
{
  return email.GetHashCode();
}

Вы можете подробнее о равенстве значений для типа .

...