{"id":13655329,"url":"https://github.com/romantitov/MockQueryable","last_synced_at":"2025-04-23T12:33:19.670Z","repository":{"id":37270233,"uuid":"115428922","full_name":"romantitov/MockQueryable","owner":"romantitov","description":"Mocking Entity Framework Core operations such ToListAsync, FirstOrDefaultAsync etc","archived":false,"fork":false,"pushed_at":"2024-09-24T08:03:53.000Z","size":359,"stargazers_count":813,"open_issues_count":6,"forks_count":80,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-04-15T04:51:42.465Z","etag":null,"topics":["automapper","dotnet-core","dotnet-framework","dotnet-standard","ef-core","efcore","entity-framework","fakeiteasy","favorite-mock-framework","firstordefaultasync","mocking","moq","netcore","netstandard20","nsubstitute","nunit","tdd","testing","tolistasync","unittests"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/romantitov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["romantitov"]}},"created_at":"2017-12-26T14:26:21.000Z","updated_at":"2025-04-07T11:01:41.000Z","dependencies_parsed_at":"2024-03-07T10:50:58.768Z","dependency_job_id":"c2911c8f-c751-47f1-9260-4cb0e81545b5","html_url":"https://github.com/romantitov/MockQueryable","commit_stats":{"total_commits":85,"total_committers":16,"mean_commits":5.3125,"dds":0.5529411764705883,"last_synced_commit":"8fddf5faf7a41dec42c3da234dbea14bd12bcfcf"},"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/romantitov%2FMockQueryable","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/romantitov%2FMockQueryable/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/romantitov%2FMockQueryable/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/romantitov%2FMockQueryable/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/romantitov","download_url":"https://codeload.github.com/romantitov/MockQueryable/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250435335,"owners_count":21430261,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automapper","dotnet-core","dotnet-framework","dotnet-standard","ef-core","efcore","entity-framework","fakeiteasy","favorite-mock-framework","firstordefaultasync","mocking","moq","netcore","netstandard20","nsubstitute","nunit","tdd","testing","tolistasync","unittests"],"created_at":"2024-08-02T03:01:02.929Z","updated_at":"2025-04-23T12:33:14.628Z","avatar_url":"https://github.com/romantitov.png","language":"C#","readme":"\r\n# MockQueryable \r\n\r\n[![Build status](https://github.com/romantitov/MockQueryable/workflows/.NET%20Core/badge.svg)](https://github.com/romantitov/MockQueryable/actions)\r\n[![Build status](https://ci.appveyor.com/api/projects/status/ggdbipcyyfb4av9e?svg=true)](https://ci.appveyor.com/project/handybudget/mockqueryable)\r\n[![Downloads](https://img.shields.io/nuget/dt/MockQueryable.Moq.svg)](https://www.nuget.org/packages/MockQueryable.Moq/)\r\n[![Downloads](https://img.shields.io/nuget/dt/MockQueryable.NSubstitute.svg)](https://www.nuget.org/packages/MockQueryable.NSubstitute/)\r\n[![Downloads](https://img.shields.io/nuget/dt/MockQueryable.FakeItEasy.svg)](https://www.nuget.org/packages/MockQueryable.FakeItEasy/)\r\n[![License](https://img.shields.io/github/license/romantitov/MockQueryable.svg)](https://github.com/romantitov/MockQueryable/blob/master/LICENSE)\r\n\r\n[![Build history](https://buildstats.info/appveyor/chart/handybudget/mockqueryable)](https://ci.appveyor.com/project/handybudget/mockqueryable/history)\r\n\r\n\r\n\r\nExtensions for mocking [Entity Framework Core](https://github.com/aspnet/EntityFrameworkCore/) (EFCore) operations such ToListAsync, FirstOrDefaultAsync etc. by [Moq](https://github.com/moq/moq), [NSubstitute](http://nsubstitute.github.io/) or [FakeItEasy](https://fakeiteasy.github.io/)\r\nWhen writing tests for your application it is often desirable to avoid hitting the database. The extensions allow you to achieve this by creating a context – with behavior defined by your tests – that makes use of in-memory data.\r\n\r\n### When should I use it?\r\n\r\nIf you have something similar to the following code: \r\n```csharp\r\nvar query = _userRepository.GetQueryable();\r\n\r\nawait query.AnyAsync(x =\u003e...)\r\nawait query.FirstOrDefaultAsync(x =\u003e...)\r\nquery.CountAsync(x =\u003e ...)\r\nquery.ToListAsync()\r\n//etc.\r\n```\r\nand you want to cover it by unit tests\r\n\r\n### How do I get started?\r\n\r\n```csharp\r\n//1 - create a List\u003cT\u003e with test items\r\nvar users = new List\u003cUserEntity\u003e()\r\n{\r\n  new UserEntity{LastName = \"ExistLastName\", DateOfBirth = DateTime.Parse(\"01/20/2012\")},\r\n  ...\r\n};\r\n\r\n//2 - build mock by extension\r\nvar mock = users.BuildMock();\r\n\r\n//3 - setup the mock as Queryable for Moq\r\n_userRepository.Setup(x =\u003e x.GetQueryable()).Returns(mock);\r\n\r\n//3 - setup the mock as Queryable for NSubstitute\r\n_userRepository.GetQueryable().Returns(mock);\r\n\r\n//3 - setup the mock as Queryable for FakeItEasy\r\nA.CallTo(() =\u003e userRepository.GetQueryable()).Returns(mock);\r\n```\r\n\r\nDo you prefer *DbSet*? \r\n\r\n```csharp\r\n//2 - build mock by extension\r\nvar mock = users.AsQueryable().BuildMockDbSet();\r\n\r\n//3 - setup DbSet for Moq\r\nvar userRepository = new TestDbSetRepository(mock.Object);\r\n\r\n//3 - setup DbSet for NSubstitute or FakeItEasy\r\nvar userRepository = new TestDbSetRepository(mock);\r\n\r\n//3 - setup the mock as Queryable for FakeItEasy\r\nA.CallTo(() =\u003e userRepository.GetQueryable()).Returns(mock);\r\n```\r\n### Can I extend the mock object created by MockQueryable with custom logic?\r\nMockQueryable creates for your tests a mock object based on in-memory data, but you can also add some custome logic to it.\r\n\r\n``` C#\r\nvar userId = Guid.NewGuid();\r\nvar users = new List\u003cUserEntity\u003e\r\n{\r\n    new UserEntity{Id = userId,LastName = \"ExistLastName\", DateOfBirth = DateTime.Parse(\"01/20/2012\")},\r\n   //etc. \r\n};\r\nvar mock = users.AsQueryable().BuildMockDbSet();\r\n\r\n//Aditional setup for FindAsync\r\nmock.Setup(x =\u003e x.FindAsync(userId)).ReturnsAsync((object[] ids) =\u003e\r\n{\r\n    var id = (Guid)ids[0];\r\n    return users.FirstOrDefault(x =\u003e x.Id == id);\r\n});\r\nvar userRepository = new TestDbSetRepository(mock.Object);\r\n\r\n//Execution FindAsync\r\nvar user = await ((DbSet\u003cUserEntity\u003e) userRepository.GetQueryable()).FindAsync(userId);\r\n```\r\n\r\nCheck out the [sample project](https://github.com/romantitov/MockQueryable/tree/master/src/MockQueryable/MockQueryable.Sample)\r\n\r\n### Where can I get it?\r\n\r\nFirst, [install NuGet](http://docs.nuget.org/docs/start-here/installing-nuget). \r\n\r\nIf you are using **Moq** - then, install [MockQueryable.Moq](https://www.nuget.org/packages/MockQueryable.Moq/) from the package manager console:\r\n\r\n```\r\nPM\u003e Install-Package MockQueryable.Moq\r\n```\r\n\r\nIf you are using **NSubstitute** - then, install [MockQueryable.NSubstitute](https://www.nuget.org/packages/MockQueryable.NSubstitute/) from the package manager console:\r\n\r\n```\r\nPM\u003e Install-Package MockQueryable.NSubstitute\r\n```\r\n\r\nIf you are using **FakeItEasy** - then, install [MockQueryable.FakeItEasy](https://www.nuget.org/packages/MockQueryable.FakeItEasy/) from the package manager console:\r\n\r\n```\r\nPM\u003e Install-Package MockQueryable.FakeItEasy\r\n```\r\n\r\n### Can I use it with my favorite mock framework?\r\n\r\nYou can install [MockQueryable.EntityFrameworkCore](https://www.nuget.org/packages/MockQueryable.EntityFrameworkCore/) from the package manager console:\r\n\r\n```\r\nPM\u003e Install-Package MockQueryable.EntityFrameworkCore\r\n```\r\n[![Downloads](https://img.shields.io/nuget/dt/MockQueryable.EntityFrameworkCore.svg)](https://www.nuget.org/packages/MockQueryable.EntityFrameworkCore/)\r\n\r\nor even [MockQueryable.Core](https://www.nuget.org/packages/MockQueryable.Core/)\r\n```\r\nPM\u003e Install-Package MockQueryable.Core\r\n```\r\n[![Downloads](https://img.shields.io/nuget/dt/MockQueryable.Core.svg)](https://www.nuget.org/packages/MockQueryable.Core/)\r\n\r\n\r\nThen [make your own extension](https://github.com/romantitov/MockQueryable/blob/master/src/MockQueryable/MockQueryable.Moq/MoqExtensions.cs) for your favorite mock framework\r\n","funding_links":["https://github.com/sponsors/romantitov"],"categories":["Testing and Mocking","Libraries","Supported Packages"],"sub_categories":["Testing","Contents"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fromantitov%2FMockQueryable","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fromantitov%2FMockQueryable","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fromantitov%2FMockQueryable/lists"}