How to I setup my Moq to return some values and having the tested service select the right one?
IRepository:
public interface IGeographicRepository { IQueryable<Country> GetCountries(); }
Service:
public Country GetCountry(int countryId) { return geographicsRepository.GetCountries() .Where(c => c.CountryId == countryId).SingleOrDefault(); }
Test:
[Test] public void Can_Get_Correct_Country() { //Setup geographicsRepository.Setup(x => x.GetCountries()).Returns() //No idea what to do here. //Call var country = geoService.GetCountry(1); //Should return object Country with property CountryName="Jamaica" //Assert Assert.IsInstanceOf<Country>(country); Assert.AreEqual("Jamaica", country.CountryName); Assert.AreEqual(1, country.CountryId); geographicsRepository.VerifyAll(); }
I'm basically stuck at the setup.
Unit testing is a powerful way to ensure that your code works as intended. It's a great way to combat the common “works on my machine” problem. Using Moq, you can mock out dependencies and make sure that you are testing the code in isolation.
Mock objects allow you to mimic the behavior of classes and interfaces, letting the code in the test interact with them as if they were real. This isolates the code you're testing, ensuring that it works on its own and that no other code will make the tests fail.
Moq supports mocking protected methods. Changing the methods to protected , instead of private , would allow you to mock their implementation.
Couldn't you use AsQueryable()?
List<Country> countries = new List<Country>(); // Add Countries... IQueryable<Country> queryableCountries = countries.AsQueryable(); geographicsRepository.Setup(x => x.GetCountries()).Returns(queryableCountries);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With