Тестирование ViewModel в WPF MVVM с Moq Framework - PullRequest
0 голосов
/ 13 января 2020

Я новичок в Moq Framework. У меня есть модель просмотра с введенными IEntityRepository

public class MainViewModel
{
    private readonly IEntityRepository _entityRepository;

    public MainViewModel(IEntityRepository entityRepository)
    {
        _entityRepository = entityRepository;
        Entities = new ObservableCollection<EntityWrapper>();
    }

    public ObservableCollection<EntityWrapper> Entities { get; set; }

    public void Load()
    {
        var entities = _entityRepository.GetAll();

        Entities.Clear();

        foreach (var entity in entities)
        {
            Entities.Add(new EntityWrapper(entity));
        }
    }

    public void AddEntity(string name, int x, int y)
    {
        var entity = new Entity()
        {
            Name = name,
            X = x,
            Y = y
        };
        _entityRepository.AddEntity(entity);
        _entityRepository.Save();
    }
}

и EntityRepository, вот так:

public class EntityRepository : IEntityRepository
{
    private Context _context;

    public EntityRepository(Context context)
    {
        _context = context;
    }

    public Entity Get(long id)
    {
        return _context.Entities.Find(id);
    }

    public IEnumerable<Entity> GetAll()
    {
        return _context.Entities.ToList();
    }

    public void AddEntity(Entity entity)
    {
        _context.Entities.Add(entity);
    }

    public void Save()
    {
        _context.SaveChanges();
    }
}

Теперь я хочу проверить Load и AddEntity методы MainViewModel это мой тестовый класс:

[TestClass]
public class MainViewModelTests
{
    private Mock<IEntityRepository> _mockRepo;
    private MainViewModel _mainViewModel;

    public MainViewModelTests()
    {
        _mockRepo = new Mock<IEntityRepository>();
        _mainViewModel = new MainViewModel(_mockRepo.Object);
    }

    [TestMethod]
    public void AddEntityTest()
    {
        var entity = new Entity()
        {
            Name = "Student",
            X = 10,
            Y = 20
        };

        _mainViewModel.AddEntity("Student", 10, 20);

        _mockRepo.Setup(m => m.AddEntity(entity));
        _mockRepo.Setup(m => m.Save());

        var entities = _mainViewModel.Entities;
        Assert.AreEqual(1, entities.Count);
    }

    [TestMethod]
    public void LoadTest()
    {
        // How to add fake data???

        _mockRepo.Setup(r => r.GetAll());

        _mainViewModel.Load();

        var entities = _mainViewModel.Entities;
        Assert.AreEqual(1, entities.Count);
    }
}

В AddEntityTest() Я не знаю, почему свойство Entities будет пустым, а в LoadTest как заполнить поддельные данные, чтобы я мог загрузить его.

1 Ответ

1 голос
/ 13 января 2020

Чтобы получить тестовые данные в методе LoadTest, вы можете использовать Moq Returns метод

_mockRepo.Setup(r => r.GetAll()).Returns(new List<Entity> { new Entity() });

Это работает, потому что List<T> реализует IEnumerable<T>.

Что касается AddEntityTest, здесь есть пара проблем. Вы устанавливаете макет

_mockRepo.Setup(m => m.AddEntity(entity));
_mockRepo.Setup(m => m.Save());

после _mainViewModel.AddEntity("Student", 10, 20); вызова. Это должно наступить раньше, Упорядочить шаг всегда перед Акт шаг, в соответствии с AAA паттерн

Вы также не обновляете Entities коллекция после добавления объекта, поэтому Entities.Count остается прежним. Я предлагаю вам также установить макет IEntityRepository.GetAll() для этого теста и обновить коллекцию Entities в MainViewModel. Или переписать логи c вашего AddEntityTest, если обновление коллекции выполнено через представление

...