Использование Moq для макета репозитория, который возвращает значение - PullRequest
8 голосов
/ 19 декабря 2010

Как мне настроить мой тестовый метод для этого макета репозитория, который принимает объект?

Это то, что я имею до сих пор:

Service.cs

    public int AddCountry(string countryName)
    {
        Country country = new Country();
        country.CountryName = countryName;
        return geographicsRepository.SaveCountry(country).CountryId;
    }

test.cs

    [Test]
    public void Insert_Country()
    {
        //Setup
        var geographicsRepository = new Mock<IGeographicRepository>();

        geographicsRepository.Setup(x => x.SaveCountry(It.Is<Country>(c => c.CountryName == "Jamaica"))); //How do I return a 1 here?

        GeographicService geoService = new GeographicService(geographicsRepository.Object);

        int id = geoService.AddCountry("Jamaica");

        Assert.AreEqual(1, id);
    }

SaveCountry(Country country); возвращает целое число.

Мне нужно сделать 2 вещи:

  1. Первый тест, мне нужно указать настройке, чтобы она возвращала int 1.
  2. Мне нужно создать второй тест Insert_Duplicate_Country_Throws_Exception(). В моей Установке, как я могу сказать репозиторию, чтобы я выдавал ошибку, когда я делаю:

    int id = geoService.AddCountry("Jamaica");
    int id = geoService.AddCountry("Jamaica");
    

Framework:

  1. NUnit.
  2. Moq.
  3. ASP.NET MVC - шаблон репозитория.

Ответы [ 2 ]

8 голосов
/ 19 декабря 2010

Ваш первый тест должен выглядеть примерно так:

[Test]
public void Insert_Country()
{
    Mock<IGeographicRepository> geographicsRepository = new Mock<IGeographicRepository>();
    GeographicService geoService = new GeographicService(geographicsRepository.Object);

    // Setup Mock
    geographicsRepository
        .Setup(x => x.SaveCountry(It.IsAny<Country>()))
        .Returns(1);

    var id = geoService.AddCountry("Jamaica");

    Assert.IsInstanceOf<Int32>(id);
    Assert.AreEqual(1, id);
    geographicsRepository.VerifyAll();
}

Второй тест должен выглядеть так:

[Test]
public void Insert_Duplicate_Country_Throws_Exception()
{
    Mock<IGeographicRepository> geographicsRepository = new Mock<IGeographicRepository>();
    GeographicService geoService = new GeographicService(geographicsRepository.Object);

    // Setup Mock
    geographicsRepository
        .Setup(x => x.SaveCountry(It.IsAny<Country>()))
        .Throws(new MyException());

    try
    {
        var id = geoService.AddCountry("Jamaica");
        Assert.Fail("Exception not thrown");
    }
    catch (MyException)
    {
        geographicsRepository.VerifyAll();
    }
}
1 голос
/ 19 декабря 2010

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

В первом сценарии вы хотите проверить, что 1 возвращается, когда вы переходите на «Ямайку». Это не фиктивный тестовый пример, а тестовый пример для реального поведения, так как вы хотите протестировать определенный ввод с ожидаемым выводом, например, «Ямайка» -> 1. В этой ситуации имитация более полезна для обеспечения того, чтобы ваша служба внутри вызывала SaveCountry хранилище с ожидаемой страной и которое возвращает значение из вызова.

Ключевым моментом является настройка вашего дела «SaveCountry», а затем вызов «VerifyAll» на макете. Это будет утверждать, что «SaveCountry» действительно был вызван со страной «Ямайка», и что ожидаемое значение возвращается. Таким образом, вы уверены, что ваш сервис подключен к вашему хранилищу, как и ожидалось.

[Test]
public void adding_country_saves_country()
{
    const int ExpectedCountryId = 666;

    var mockRepository = new Mock<IGeographicRepository>();

    mockRepository.
      Setup(x => x.SaveCountry(It.Is<Country>(c => c.CountryName == "Jamaica"))).
      Returns(ExpectedCountryId); 

    GeographicService service= new GeographicService(mockRepository.Object);

    int id = service.AddCountry(new Country("Jamaica"));

    mockRepo.VerifyAll();

    Assert.AreEqual(ExpectedCountryId, id, "Expected country id.");
}

Во втором сценарии вы хотите проверить, возникает ли исключение при попытке добавить дублирующуюся страну. Делать это с макетом не имеет особого смысла, так как все, что вы будете проверять, это то, что ваш макет ведет себя при добавлении дубликатов, а не в реальной реализации.

...