FastMoq 2.23.123
See the version list below for details.
dotnet add package FastMoq --version 2.23.123
NuGet\Install-Package FastMoq -Version 2.23.123
<PackageReference Include="FastMoq" Version="2.23.123" />
paket add FastMoq --version 2.23.123
#r "nuget: FastMoq, 2.23.123"
// Install FastMoq as a Cake Addin #addin nuget:?package=FastMoq&version=2.23.123 // Install FastMoq as a Cake Tool #tool nuget:?package=FastMoq&version=2.23.123
FastMoq
Easy and fast extension of the Moq mocking framework for mocking and auto injection of classes when testing.
API Documentation
Features
- NOW BLAZOR SUPPORT in FastMoq and FastMoq.Web.
- Test without declaring Mocks (unless needed).
- Creates objects with chain of automatic injections in objects and their dependencies.
- Creates Mocks and Objects with properties populated.
- Automatically injects and creates components or services.
- Injection: Automatically determines what interfaces need to be injected into the constructor and creates mocks if they do not exist.
- Generate Mock using specific data.
- Best guess picks the multiple parameter constructor over the default constructor.
- Specific mapping allows the tester to create an instance using a specific constructor and specific data.
- Supports Inject Attributes and multiple constructors.
- Use Mocks without managing fields and properties. Mocks are managed by the Mocker framework. No need to keep track of Mocks. Just use them!
- Create instances of Mocks with non public constructors.
- HttpClient and IFileSystem test helpers
- DbContext support - SqlLite and mockable objects.
- Supports Null method parameter testing.
Packages
- FastMoq - Combines FastMoq.Core and FastMoq.Web. -.NET Core 6.0 and 7.0.
- FastMoq.Core - Original FastMoq testing Mocker. -.NET 6.0, and 7.0.
- FastMoq.Web - New Blazor and Web support. -.NET Core 6.0 and 7.0.
Targets
- .NET 7
- .NET 6
Most used classes in the FastMoq namespace
public class Mocker {} // Primary class for auto mock and injection. This can be used standalone from MockerTestBase using Mocks property on the base class.
public abstract class MockerTestBase<TComponent> where TComponent : class {} // Assists in the creation of objects and provides direct access to Mocker.
Most used classes in the FastMoq.Web.Blazor namespace
public abstract class MockerBlazorTestBase<T> : TestContext, IMockerBlazorTestHelpers<T> where T : ComponentBase // Assists in the creation of Blazor components and provides direct access to Mocker.
Examples
Basic example of the base class creating the Car class and auto mocking ICarService
public class CarTest : MockerTestBase<Car> {
[Fact]
public void TestCar() {
Component.Color.Should().Be(Color.Green);
Component.CarService.Should().NotBeNull();
}
}
public class Car {
public Color Color { get; set; } = Color.Green;
public ICarService CarService { get; }
public Car(ICarService carService) => CarService = carService;
}
public interface ICarService
{
Color Color { get; set; }
ICarService CarService { get; }
bool StartCar();
}
Example of how to set up for mocks that require specific functionality
public class CarTest : MockerTestBase<Car> {
public CarTest() : base(mocks => {
mocks.Initialize<ICarService>(mock => mock.Setup(x => x.StartCar).Returns(true));
}
}
Auto Injection
Auto injection allows creation of components with parameterized interfaces. If an override for creating the component is not specified, the component will be created will the default Mock Objects.
Auto Injection with instance parameters
Additionally, the creation can be overwritten and provided with instances of the parameters. CreateInstance will automatically match the correct constructor to the parameters given to CreateInstance.
Mocks.CreateInstance(new MockFileSystem()); // CreateInstance matches the parameters and types with the Component constructor.
Interface Type Map
When multiple classes derive from the same interface, the Interface Type Map can map with class to use for the given injected interface. The map can also enable mock substitution.
Example of two classes inheriting the same interface
public class TestClassDouble1 : ITestClassDouble {}
public class TestClassDouble2 : ITestClassDouble {}
Mapping
This code maps ITestClassDouble to TestClassDouble1 when testing a component with ITestClassDouble.
Mocker.AddType<ITestClassDouble, TestClassDouble1>();
The map also accepts parameters to tell it how to create the instance.
Mocks.AddType<ITestClassDouble, TestClassDouble1>(() => new TestClassDouble());
DbContext Mocking
Test ContextDb
public class DbContextTests : MockerTestBase<MyDbContext>
Use ContextDb in test methods
var mockDbContext = Mocks.GetMockDbContext<MyDbContext>();
var dbContext = mockDbContext.Object;
Null / Parameter checking
Testing constructor parameters is very easy with TestAllConstructorParameters and TestConstructorParameters.
TestConstructorParameters - Test the constructor that MockerTestBase used to create the Component for the test. TestAllConstructorParameters - Test all constructors in the component, regardless if the constructor was used to create the component for the test.
Example: Check values for null
// Check values for null
[Fact]
public void Service_NullArgChecks() => TestConstructorParameters((action, constructorName, parameterName) =>
{
output?.WriteLine($"Testing {constructorName}\n - {parameterName}");
action
.Should()
.Throw<ArgumentNullException>()
.WithMessage($"*{parameterName}*");
});
Example: Check values for specific criteria
// Check values for specific criteria.
[Fact]
public void Service_NullArgChecks() => TestConstructorParameters((action, constructorName, parameterName) =>
{
output?.WriteLine($"Testing {constructorName}\n - {parameterName}");
action
.Should()
.Throw<ArgumentNullException>()
.WithMessage($"*{parameterName}*");
},
info =>
{
return info switch
{
{ ParameterType: { Name: "string" }} => string.Empty,
{ ParameterType: { Name: "int" }} => -1,
_ => default,
};
},
info =>
{
return info switch
{
{ ParameterType: { Name: "string" }} => "Valid Value",
{ ParameterType: { Name: "int" }} => 22,
_ => Mocks.GetObject(info.ParameterType),
};
}
);
Example: Test constructors for null with output
// Test constructors for null, using built-in extension and log the output.
[Fact]
public void TestAllConstructors_WithExtension()
{
var messages = new List<string>();
TestAllConstructorParameters((action, constructor, parameter) => action.EnsureNullCheckThrown(parameter, constructor, messages.Add));
messages.Should().Contain(new List<string>()
{
"Testing .ctor(IFileSystem fileSystem, String field)\n - fileSystem",
"Passed fileSystem",
"Testing .ctor(IFileSystem fileSystem, String field)\n - field",
"Passed field",
}
);
}
Additional Documentation
Breaking Change
- 2.23.Latest ⇒ Removed support for .NET Core 5.
- 2.22.1215 ⇒ Removed support for .NET Core 3.1 in FastMoq.Core. Deprecated .NET Core 5 and moved package supporting .NET Core 5.0 from FastMoq to FastMoq.Core.
- 1.22.810 ⇒ Removed setters on the MockerTestBase virtual methods: SetupMocksAction, CreateComponentAction, CreatedComponentAction
- 1.22.810 ⇒ Update Package Dependencies
- 1.22.728 ⇒ Initialize method will reset the mock, if it already exists. This is overridable by settings the reset parameter to false.
- 1.22.604 ⇒ Renamed Mocks to Mocker, Renamed TestBase to MockerTestBase.
License - MIT
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net6.0
- FastMoq.Core (>= 2.23.123)
- FastMoq.Web (>= 2.23.123)
-
net7.0
- FastMoq.Core (>= 2.23.123)
- FastMoq.Web (>= 2.23.123)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
2.28.3 | 137 | 10/18/2024 |
2.28.2 | 82 | 10/17/2024 |
2.27.6 | 92 | 8/1/2024 |
2.27.5 | 65 | 7/29/2024 |
2.27.4 | 151 | 6/27/2024 |
2.27.3 | 107 | 6/13/2024 |
2.27.2 | 111 | 5/30/2024 |
2.27.1 | 95 | 5/29/2024 |
2.27.0 | 102 | 5/28/2024 |
2.25.0 | 144 | 4/10/2024 |
2.24.300 | 325 | 2/1/2024 |
2.23.201 | 547 | 12/13/2023 |
2.23.200 | 445 | 12/2/2023 |
2.23.124 | 486 | 11/7/2023 |
2.23.123 | 459 | 11/3/2023 |
2.23.122 | 518 | 10/11/2023 |
2.23.120 | 568 | 8/31/2023 |
2.23.118 | 707 | 5/24/2023 |
2.23.117 | 627 | 5/4/2023 |
2.23.116 | 720 | 3/31/2023 |
2.23.115 | 797 | 1/14/2023 |
2.23.113.2138 | 770 | 1/13/2023 |
2.22.1215.1748 | 828 | 12/15/2022 |
1.22.1128.2310 | 860 | 11/28/2022 |
1.22.1117.1322 | 852 | 11/17/2022 |
1.22.1113.29 | 841 | 11/13/2022 |
1.22.1111.1837 | 850 | 11/11/2022 |
1.22.831.1343 | 917 | 8/31/2022 |
1.22.810.1759 | 919 | 8/10/2022 |
1.22.809.1253 | 929 | 8/9/2022 |
1.22.805.1334 | 958 | 8/5/2022 |
1.22.728.1251 | 919 | 7/28/2022 |
1.22.727.1847 | 900 | 7/27/2022 |
1.22.604.1441 | 936 | 6/4/2022 |
1.22.531.1514 | 945 | 5/31/2022 |
1.22.531.1336 | 899 | 5/31/2022 |
1.22.529.1812 | 904 | 5/29/2022 |
1.0.0 | 423 | 11/3/2023 |