Я использую макет для тестов с использованием nunit, но он не входит в метод

#c# #unit-testing #xamarin.forms #nunit

#c# #модульное тестирование #xamarin.forms #nunit

Вопрос:

Я тестирую свою ViewModel, которая содержит метод, который исходит из внедрения зависимостей, но не вводит метод, я, честно говоря, не знаю, что я делаю неправильно.

мой тест.

     [TestCase("5")]
    [TestCase("10")]
    [TestCase("-1")]
    [TestCase("0")]
    [TestCase("100")]
    //[TearDown]
    [Test]
    public async Task Deve_Obter_A_Lista_De_Herois_Dado_A_Quantidade_Menor_Ou_Igual_A_100_E_Maior_Que_Zero(string quantidadeHerois)
    {
        //Arrang
        var mockRepo = new Mock<IHeroes>();
        ListHeroesViewViewModel listHeroesViewViewModel = new ListHeroesViewViewModel(null, mockRepo.Object);


        //action 
        await listHeroesViewViewModel.GetHeroes(quantidadeHerois);

        //assert 
        if(quantidadeHerois.Equals("5"))
            Assert.AreEqual(5, listHeroesViewViewModel.Herois.Count);
        else if (quantidadeHerois.Equals("10"))
            Assert.AreEqual(10, listHeroesViewViewModel.Herois.Count);
        else
            Assert.AreEqual(100, listHeroesViewViewModel.Herois.Count);
    }
 

моя viewmodel

 public async Task GetHeroes(string limit)
    {
        try
        {
            IsBusy = true;
            ///
            ////in this point it does not enter the method and returns null////
            ///
            var heroes = await _heroes.GetHeroes(limit);
            if (heroes.data != null)
                Herois = new ObservableCollection<Result>(heroes.data.results);
        }
        catch (Exception ex)
        {
            await App.Current.MainPage.DisplayAlert("Atenção", $"Error:{ex.Message}", "Ok");
        }
        finally
        {
            IsBusy = false;
        }
    }
 

конструктор ViewModel

 public ListHeroesViewViewModel(INavigationService navigationService, IHeroes heroes) : base(navigationService)
    {
        _navigation = navigationService;
         //
         ///here he receives the dependency caused by mock.object
         //
        _heroes = heroes;
        Title = "Heroes";
    }
 

Я не знаю, что я могу делать неправильно, спасибо за понимание, это мой первый тест

Комментарии:

1. Вы не настраиваете GetHeroes метод. И если это ваш первый тест, я предлагаю вам прочитать немного больше о mocking. Похоже, вы используете Moq, поэтому начните здесь: github.com/moq/moq4

Ответ №1:

По умолчанию макет будет возвращать значения по умолчанию, что означает, что для типов классов вы получаете null .

Если вы хотите что-то вернуть, вам нужно это настроить.

Вот пример настройки , которая говорит всякий раз , когда что — то вызывает метод GetHeroes return new Hero() .

 var mockRepo = new Mock<IHeroes>();
mockRepo.Setup(x => x.GetHeroes(It.IsAny<string>())).Returns(new Hero());
 

Это простая настройка, вы можете сделать ее настолько сложной, насколько захотите.

Здесь вы можете найти более подробную информацию о том, как работает mocking.