Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Moq to mock a repository that returns IQueryable<MyObject>

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.

like image 755
Shawn Mclean Avatar asked Dec 19 '10 03:12

Shawn Mclean


People also ask

What can be mocked with MOQ?

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.

How does MOQ mock work?

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.

Can you mock a private method MOQ?

Moq supports mocking protected methods. Changing the methods to protected , instead of private , would allow you to mock their implementation.


1 Answers

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); 
like image 72
Andrew Whitaker Avatar answered Sep 22 '22 09:09

Andrew Whitaker