I sometimes need to write unit tests which uses IQueryable. For example, a repository or a service returns IQueryable, which I need to use inside unit test.
Scenario
Let's say I have an interface which returns IQueryable.
public interface IMyService { public IQueryable<string> GetPeopleQuery(); }
And then I need to test the following class.
public class SomeClass { private IMyService myService; public SomeClass(IMyService myService) { this.myService = myService; } public List<string> HelloToPeople() { var people = myService.GetPeopleQuery().ToList(); var helloPeople = people.Select(x=>x.Insert(0, "hello ")).ToList(); return helloPeople; } }
Write Test
I use xUnit as an exmaple. I create IQueryable from the expected result and use it as Mock.Setup
.
[Fact] public void TestHello() { var dummyQuery = (new List<string>() { "ken", "nozomi" }).AsQueryable(); var mockedIMyService = new Mock<IMyService>(); mockedIMyService.Setup(x => x.GetPeopleQuery()).Returns(dummyQuery); var someClass = new SomeClass(mockedIMyService.Object); var results = someClass.HelloToPeople(); Assert.Equal("hello ken", results.First()); Assert.Equal("hello nozomi", results.Last()); }
That's it.
Top comments (0)