{"id":50382285,"url":"https://github.com/nsubstitute/NSubstitute.Analyzers","last_synced_at":"2026-06-16T04:00:37.082Z","repository":{"id":37484661,"uuid":"134338260","full_name":"nsubstitute/NSubstitute.Analyzers","owner":"nsubstitute","description":"Roslyn analysers for NSubstitute.","archived":false,"fork":false,"pushed_at":"2024-10-05T20:14:19.000Z","size":3631,"stargazers_count":32,"open_issues_count":19,"forks_count":6,"subscribers_count":4,"default_branch":"dev","last_synced_at":"2026-05-06T05:08:35.194Z","etag":null,"topics":["csharp","dotnet","nsubstitute","roslyn-analyzer"],"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/nsubstitute.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","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,"zenodo":null}},"created_at":"2018-05-22T00:11:19.000Z","updated_at":"2025-11-25T15:44:14.000Z","dependencies_parsed_at":"2023-12-25T21:12:29.203Z","dependency_job_id":"a0869723-5075-459d-bf16-6b6d573f319e","html_url":"https://github.com/nsubstitute/NSubstitute.Analyzers","commit_stats":{"total_commits":492,"total_committers":5,"mean_commits":98.4,"dds":0.1382113821138211,"last_synced_commit":"abe5b9f19981b197863b52516c5d68b69979e43e"},"previous_names":[],"tags_count":24,"template":false,"template_full_name":null,"purl":"pkg:github/nsubstitute/NSubstitute.Analyzers","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nsubstitute%2FNSubstitute.Analyzers","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nsubstitute%2FNSubstitute.Analyzers/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nsubstitute%2FNSubstitute.Analyzers/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nsubstitute%2FNSubstitute.Analyzers/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nsubstitute","download_url":"https://codeload.github.com/nsubstitute/NSubstitute.Analyzers/tar.gz/refs/heads/dev","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nsubstitute%2FNSubstitute.Analyzers/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34390052,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-16T02:00:06.860Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["csharp","dotnet","nsubstitute","roslyn-analyzer"],"created_at":"2026-05-30T13:00:21.703Z","updated_at":"2026-06-16T04:00:37.077Z","avatar_url":"https://github.com/nsubstitute.png","language":"C#","funding_links":[],"categories":["Popular Analyzers"],"sub_categories":["3rd party libraries"],"readme":"Analyzers to detect possible NSubstitute usage problems, such as attempts to setup non-virtual members.\n\n| Branch        | Build           | Coverage  |\n| ------------- |-------------| -----|\n| Master      | [![Build status](https://ci.appveyor.com/api/projects/status/t9lhmp61nuy3a7k5/branch/master?svg=true)](https://ci.appveyor.com/project/NSubstitute/nsubstitute-analyzers/branch/master)      |   [![Coverage Status](https://coveralls.io/repos/github/nsubstitute/NSubstitute.Analyzers/badge.svg?branch=master)](https://coveralls.io/github/nsubstitute/NSubstitute.Analyzers?branch=master) |\n| Dev      | [![Build status](https://ci.appveyor.com/api/projects/status/t9lhmp61nuy3a7k5/branch/dev?svg=true)](https://ci.appveyor.com/project/NSubstitute/nsubstitute-analyzers/branch/dev)    |   [![Coverage Status](https://coveralls.io/repos/github/nsubstitute/NSubstitute.Analyzers/badge.svg?branch=dev)](https://coveralls.io/github/nsubstitute/NSubstitute.Analyzers?branch=dev) |\n\n## Install via NuGet\n\n* [NSubstitute.Analyzers.CSharp](https://www.nuget.org/packages/NSubstitute.Analyzers.CSharp/)\n* [NSubstitute.Analyzers.VisualBasic](https://www.nuget.org/packages/NSubstitute.Analyzers.VisualBasic/)\n\n## Motivation\n\n[NSubstitute](https://github.com/nsubstitute/NSubstitute) was designed with the aim of having concise, friendly syntax for mocking. The downside of this syntax is that certain failure modes are hard to detect. One example is attempting to mock non-virtual members -- NSubstitute can not see these calls so can not communicate problems such as `sub.Received().NonVirtualCall()`. Thanks to the goodness of Roslyn analyzers, we now have the option to detect cases like these (as originally proposed in [NSubstitute issue #328](https://github.com/nsubstitute/NSubstitute/issues/328)).\n\n## Documentation\n\nFor documentation and reasoning on the rules themselves, see the [Documentation](https://github.com/nsubstitute/NSubstitute.Analyzers/blob/master/documentation).\n\n## Support\n\nPlease report any problems or ask questions via the [Issue tracker](https://github.com/nsubstitute/NSubstitute.Analyzers/issues).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnsubstitute%2FNSubstitute.Analyzers","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnsubstitute%2FNSubstitute.Analyzers","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnsubstitute%2FNSubstitute.Analyzers/lists"}