On 2020/10/04, and starting with version 1.2.3, AddUp.RabbitMQ.Fakes was renamed to AddUp.FakeRabbitMQ. This concerns:
- This repository name: https://github.com/addupsolutions/AddUp.FakeRabbitMQ,
- The Nuget package name: https://www.nuget.org/packages/AddUp.FakeRabbitMQ/,
- The Assembly name:
AddUp.FakeRabbitMQ.dll
.
However, the root namespace remains (for compatibility purpose) AddUp.RabbitMQ.Fakes
.
I deemed this renaming necessary as the Fakes
suffix collides with Microsoft Fakes product. Because the assembly name ends with .Fakes
, several unit-test related tools consider it not to be a real assembly but rather something generated by Microsoft Fakes.
AddUp.FakeRabbitMQ is a fork of https://github.com/Parametric/RabbitMQ.Fakes. Thanks to the folks over there for their work without which our own version would probably never have been possible.
AddUp.FakeRabbitMQ provides fake implementations of the RabbitMQ.Client interfaces (see https://www.nuget.org/packages/RabbitMQ.Client for the nuget package and https://github.com/rabbitmq/rabbitmq-dotnet-client for its source code). They are intended to be used for testing so that unit tests that depend on RabbitMQ can be executed fully in memory withouth needing an external RabbitMQ server.
AddUp.FakeRabbitMQ builds on top of the original project:
- Targets .NET Standard 2.0
- Supports Default, Direct, Topic and Fanout exchange types.
- NB: Headers exchange type is not supported; however, it won't throw (it is implemented the same way as the Fanout type)
Thanks to all the contributors:
Versions 1.x are based on RabbitMQ .NET client Version 5.x
Versions 2.x are based on RabbitMQ .NET client Version 6.x
- Fixed Issue #180: Now non-AutoAck scenarios work better (not sure though if they are completely equivalent to what a real RabbitMQ instance would do). Thanks to @manuelspezzani for providing repro unit tests.
Note that this version might be technically breaking as some
public
members are now eitherinternal
or implemented rather differently. Anyway those are implementation details and should not be used from client code. I intend to internalize more implementation details in the future so as to not leak abstractions.
Also note that this is far from being bulletproof: The unit tests associated with issue #180 pass, but there are still many scenarios that do not work the same as with a real RabbitMQ server (for example, do not try to requeue a
nacked
message, it won't work).
- Updated RabbitMQ.Client to version 6.6.0 thanks to @marcusber's PR #174
- Updated RabbitMQ.Client to version 6.5.0
Two contributions by @patrikwlund:
- Better compliance: No more unique singleton-based connection. See PR #122 for details.
- New feature: by passing a boolean to the constructor of
AddUp.RabbitMQ.Fakes.RabbitServer
, one can opt into using blocking delivery (the default remains non-blocking). This helps simplifying unit tests in scenarios where one is not interested in simulating a real RabbitMQ behavior (avoids asynchronous waiting for messages delivery). See PR #123 for details.
- @patrikwlund improved the performance of PR #118. See PR #121 for details.
- Yet another set of improvements by @Quogu. See PR #120 for details.
Another pair of improvements by @Quogu:
- Better compliance: A unique consumer tag is now generated when the calling code does not provide any. See PR #117 for details.
- Better underlying delivery model (using
Task
s). Should reduce deadlock issues in Test code. See PR #118 for details.
- A few types in the implementation of the fake server are now
public
. This may prove useful in order to examine the inners of the server for tests purpose. See PR #115 for details. - Better compliance: newly declared queues are now bound to RabbitMQ's default exchange. See PR #116 for details.
- Updated RabbitMQ.Client to version 6.4.0
- Based on RabbitMQ.Client version 6.2.4
- Updated dependencies (obviously except for RabbitMQ.Client that is still version 5.2.0)
Mostly cleanup of the codebase as preparatory work for the v6 client implementation
- Code cleanup:
- Removed useless overloads and members in
FakeModel
. - Refactored Unit Tests (split
IModel
tests into several classes, got rid of the Arrange, Act and Assert comments, renamed methods) + added a few ones.
- Removed useless overloads and members in
- No-op implementation in
IModel.TxSelect
,IModel.TxCommit
andIModel.TxRollback
instead of throwing. - Implemented
IModel.MessageCount(queue)
andIModel.ConsumerCount(queue)
based onQueueDeclarePassive
. IModel.QueuePurge
now returns the number of purged messages.
This release merges the PR by @inbarbarkai. They are one year-old, and I'm ashamed it took me this long to merge them. Because I'm now watching the repository, I should need less time to react in the future... Once again thanks for his contribution.
- BUGFIX: #30.
QueueDeclarePassive
now throws if the queue does not exist. Similarly,ExchangeDeclarePassive
throws if the exchange does not exist. - FEATURE: #29. Support for the Alternate Exchange Feature.
- BUGFIX: #28.
DefaultBasicConsumer.IsRunning
property is now correctly returning true/false.
- BUGFIX: #27. It was impossible to create a connection after having created and closed a previous connection.
- BUGFIX: #25. Now it is possible to close a
Channel
after its connection was closed without theChannel.Close
method throwing (this is consistent with how RabbitMQ.Client behaves).
Most of the work in this release was contributed by @inbarbarkai. Thanks to him!
- As suggested by @inbarbarkai: Basic support for
IModel.ConfirmSelect
and theIModel.WaitForConfirms*
family. - Support for
IModel.CreateBasicPublishBatch
was added thanks to PR #21 by @inbarbarkai. - Consumers that implement both
IBasicConsumer
andIAsyncBasicConsumer
are correctly handled byIModel.BasicConsume
andIModel.BasicCancel
thanks to PR #23 by @inbarbarkai.
- Renamed from AddUp.RabbitMQ.Fakes to AddUp.FakeRabbitMQ.
- BUGFIX: Closing a connection could throw if owned models were closed before.
- Updated to RabbitMQ.Client to version 5.2.0
- First released version of AddUp.RabbitMQ.Fakes. Based on RabbitMQ.Client version 5.1.2
- NB: the version starts at 1.2.0 so as not to collide with previous internal versions.
This work is provided under the terms of the MIT License.