All Projects → nsubstitute → Nsubstitute

nsubstitute / Nsubstitute

Licence: other
A friendly substitute for .NET mocking libraries.

Programming Languages

C#
18002 projects
F#
602 projects

Projects that are alternatives of or similar to Nsubstitute

Prig
Prig is a lightweight framework for test indirections in .NET Framework.
Stars: ✭ 106 (-93.56%)
Mutual labels:  dot-net, test, testing-tools, mock, mocking
Mocktopus
Mocking framework for Rust
Stars: ✭ 179 (-89.13%)
Mutual labels:  test, testing-tools, mock, mocking
mockingbird
🐦 Decorator Powered TypeScript Library for Creating Mocks
Stars: ✭ 70 (-95.75%)
Mutual labels:  mock, test, mocking, mocks
aem-stubs
Tool for providing sample data for AEM applications in a simple and flexible way. Stubbing server on AEM, no separate needed.
Stars: ✭ 40 (-97.57%)
Mutual labels:  mock, mocking, stubs, mocks
Mockito
Most popular Mocking framework for unit tests written in Java
Stars: ✭ 12,453 (+656.56%)
Mutual labels:  testing-tools, mock, mocking, mocks
laika
Log, test, intercept and modify Apollo Client's operations
Stars: ✭ 99 (-93.99%)
Mutual labels:  mock, test, mocking, testing-tools
Httpretty
Intercept HTTP requests at the Python socket level. Fakes the whole socket module
Stars: ✭ 1,930 (+17.25%)
Mutual labels:  testing-tools, mock, mocking
Dotnetcore
.NET 5 Nuget Packages.
Stars: ✭ 146 (-91.13%)
Mutual labels:  dotnet-core, dotnetcore, dot-net
Netbarcode
Barcode generation library written in C# and .NET Standard 2
Stars: ✭ 149 (-90.95%)
Mutual labels:  dotnet-core, dotnetcore, dot-net
Architecture
.NET 6, ASP.NET Core 6, Entity Framework Core 6, C# 10, Angular 13, Clean Code, SOLID, DDD.
Stars: ✭ 2,285 (+38.82%)
Mutual labels:  dotnet-core, dotnetcore, dot-net
Designpatterns
Simple repository containing one simple example for all existing patterns in C#
Stars: ✭ 231 (-85.97%)
Mutual labels:  dotnet-core, dotnetcore, dot-net
umock-c
A pure C mocking library
Stars: ✭ 29 (-98.24%)
Mutual labels:  mock, mocking, mocks
Mockaco
🐵 HTTP mock server, useful to stub services and simulate dynamic API responses, leveraging ASP.NET Core features, built-in fake data generation and pure C# scripting
Stars: ✭ 213 (-87.06%)
Mutual labels:  mock, mocking, mocks
Retromock
Java library for mocking responses in a Retrofit service.
Stars: ✭ 48 (-97.08%)
Mutual labels:  mock, mocking, testing-tools
Mockery
A mock code autogenerator for Golang
Stars: ✭ 3,138 (+90.64%)
Mutual labels:  mock, mocking, mocks
Hippolyte
HTTP Stubbing in Swift
Stars: ✭ 109 (-93.38%)
Mutual labels:  mock, test, mocking
mock-inspect
Mocks network requests and allows you to make assertions about how these requests happened. Supports auto-mocking of graphQL requests given a valid schema.
Stars: ✭ 19 (-98.85%)
Mutual labels:  mocking, testing-tools, mocks
Mimic
Seamless client side mocking
Stars: ✭ 380 (-76.91%)
Mutual labels:  test, mock, mocking
Faux Jax
NO MORE MAINTAINED: Intercept and respond to requests in the browser (AJAX) and Node.js (http(s) module)
Stars: ✭ 93 (-94.35%)
Mutual labels:  test, mock
Docker Series
Docker Series about containerizing ASP.NET Core app with MySQL..
Stars: ✭ 88 (-94.65%)
Mutual labels:  dotnet-core, dotnetcore

NSubstitute

Build status Travis Build Status Nuget

Visit the NSubstitute website for more information.

What is it?

NSubstitute is designed as a friendly substitute for .NET mocking libraries.

It is an attempt to satisfy our craving for a mocking library with a succinct syntax that helps us keep the focus on the intention of our tests, rather than on the configuration of our test doubles. We've tried to make the most frequently required operations obvious and easy to use, keeping less usual scenarios discoverable and accessible, and all the while maintaining as much natural language as possible.

Perfect for those new to testing, and for others who would just like to to get their tests written with less noise and fewer lambdas.

Installation

Getting help

If you have questions, feature requests or feedback on NSubstitute please raise an issue on our project site. All questions are welcome via our project site, but for "how-to"-style questions you can also try StackOverflow with the [nsubstitute] tag, which often leads to very good answers from the larger programming community. StackOverflow is especially useful if your question also relates to other libraries that our team may not be as familiar with (e.g. NSubstitute with Entity Framework). You can also head on over to the NSubstitute discussion group if you prefer.

Basic use

Let's say we have a basic calculator interface:

public interface ICalculator
{
    int Add(int a, int b);
    string Mode { get; set; }
    event Action PoweringUp;
}

We can ask NSubstitute to create a substitute instance for this type. We could ask for a stub, mock, fake, spy, test double etc., but why bother when we just want to substitute an instance we have some control over?

_calculator = Substitute.For<ICalculator>();

⚠️ Note: NSubstitute will only work properly with interfaces or with virtual members of classes. Be careful substituting for classes with non-virtual members. See Creating a substitute for more information.

Now we can tell our substitute to return a value for a call:

_calculator.Add(1, 2).Returns(3);
Assert.That(_calculator.Add(1, 2), Is.EqualTo(3));

We can check that our substitute received a call, and did not receive others:

_calculator.Add(1, 2);
_calculator.Received().Add(1, 2);
_calculator.DidNotReceive().Add(5, 7);

If our Received() assertion fails, NSubstitute tries to give us some help as to what the problem might be:

NSubstitute.Exceptions.ReceivedCallsException : Expected to receive a call matching:
    Add(1, 2)
Actually received no matching calls.
Received 2 non-matching calls (non-matching arguments indicated with '*' characters):
    Add(1, *5*)
    Add(*4*, *7*)

We can also work with properties using the Returns syntax we use for methods, or just stick with plain old property setters (for read/write properties):

_calculator.Mode.Returns("DEC");
Assert.That(_calculator.Mode, Is.EqualTo("DEC"));

_calculator.Mode = "HEX";
Assert.That(_calculator.Mode, Is.EqualTo("HEX"));

NSubstitute supports argument matching for setting return values and asserting a call was received:

_calculator.Add(10, -5);
_calculator.Received().Add(10, Arg.Any<int>());
_calculator.Received().Add(10, Arg.Is<int>(x => x < 0));

We can use argument matching as well as passing a function to Returns() to get some more behaviour out of our substitute (possibly too much, but that's your call):

_calculator
   .Add(Arg.Any<int>(), Arg.Any<int>())
   .Returns(x => (int)x[0] + (int)x[1]);
Assert.That(_calculator.Add(5, 10), Is.EqualTo(15));

Returns() can also be called with multiple arguments to set up a sequence of return values.

_calculator.Mode.Returns("HEX", "DEC", "BIN");
Assert.That(_calculator.Mode, Is.EqualTo("HEX"));
Assert.That(_calculator.Mode, Is.EqualTo("DEC"));
Assert.That(_calculator.Mode, Is.EqualTo("BIN"));

Finally, we can raise events on our substitutes (unfortunately C# dramatically restricts the extent to which this syntax can be cleaned up):

bool eventWasRaised = false;
_calculator.PoweringUp += () => eventWasRaised = true;

_calculator.PoweringUp += Raise.Event<Action>();
Assert.That(eventWasRaised);

Building

NSubstitute and its tests can be compiled and run using Visual Studio and Visual Studio for Mac. Note that some tests are marked [Pending] and are not meant to pass at present, so it is a good idea to exclude tests in the Pending category from test runs.

There are also build scripts in the ./build directory for command line builds, and CI configurations in the project root.

To do full builds you'll also need Ruby, as the jekyll gem is used to generate the website.

Other libraries you may be interested in

  • Moq: the original Arrange-Act-Assert mocking library for .NET, and a big source of inspiration for NSubstitute.
  • FakeItEasy: another modern mocking library for .NET. If you're not sold on NSubstitute's syntax, try FIE!
  • substitute.js: a mocking library for TypeScript inspired by NSubstitute's syntax (@fluffy-spoon/substitute on NPM)
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].