I am unit testing a wrapper to the MongoDB C# driver. I have this line of code:
Collection.Find(predicate).ToListAsync();
Where Collection
is of type IMongoCollection<T>
and Find(predicate)
returns an instance implementing IFindFluent<T, T>
. ToListAsync()
is an extension to turn the results into a list, I assume.
I am attempting to write unit tests, and I am stumped on handling this. I can't make a wrapper class because that's what I'm working on. I would prefer to either make it so ToListAsync()
returns a created list OR to mock the Find()
to return something that can be made a list of.
If anyone would struggle with getting it to work, what I did to mock Find()
method was:
[TestFixture]
class QueryControllerTests
{
private IOptions<MongoSettings> _mongoSettings;
private QueryController _queryController;
private Mock<IFakeMongoCollection> _fakeMongoCollection;
private Mock<IFindFluent<BsonDocument, BsonDocument>> _fakeCollectionResult;
[OneTimeSetUp]
public void Setup()
{
_fakeMongoCollection = new Mock<IFakeMongoCollection>();
_fakeCollectionResult = new Mock<IFindFluent<BsonDocument, BsonDocument>>();
}
}
where IFakeMongoCollection
is:
public interface IFakeMongoCollection : IMongoCollection<BsonDocument>
{
IFindFluent<BsonDocument, BsonDocument> Find(FilterDefinition<BsonDocument> filter, FindOptions options);
}
I wound up making a little abstraction layer for this, since I couldn't find anything suitable and asking for help yielded no answers.
I created an interface/implementation pair called AppCollection
specifically to handle the MongoDB interface. IAppCollection
would have a method for IAppCollection.ToList(predicate)
, and the AppCollection
would run the Collection.Find(predicate).ToListAsync();
call, returning the list. Later, it was a trivial matter to mock the IAppCollection
to make sure the right calls were being made. While I couldn't test the predicates in native LINQ, I could at least compile the predicates and compare them to passing/failing objects.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With