Search code examples
c#mongodbunit-testingmockingrhino-mocks

How can MongoDB WriteConcernResult Be mocked?


I am trying to mock a WriteConcernResult returned via an Insert();

A WriteConcernResult is returned by my provider and the Insert() is called via Add User:

private readonly IMongoProvider _repository;

public UserRepository(IMongoProvider repository)
{
    _repository = repository.ForCollection("User");
}

public bool AddUser(UserModel user)
{
    var result = _repository.Insert(user);
    return result.DocumentsAffected > 0;
}

The MongoDB WriteConcernResult class:

public WriteConcernResult(BsonDocument response)
{
    _response = Ensure.IsNotNull(response, nameof(response));
}

public long DocumentsAffected
{
    get
    {
        BsonValue value;
        return _response.TryGetValue("n", out value) ? value.ToInt64() : 0;
    }
}

Because DocumentsAffected does not have a setter I am unsure how to set a value my mock will return.

{
    var user = new UserModel {Name = "Test"};

    _mockMongoProvider = MockRepository.GenerateMock<IMongoProvider>();

     //mock writeConcernResult

     var result = _repo.AddUser(user);
     Assert.That(result, Is.True);
}

With a setter I would likely mock like this:

_mockMongoProvider.Stub(p => p.Insert(user))
                  .Return(new WriteConcernResult(
                                                    new BsonDocument()
                                                ).DocumentsAffected = 1);

Any guidance would be very helpful, cheers.


Solution

  • Actually you don't need to mock the WriteConcernResult class at all.

    All you have to do is to initialize an instance of WriteConcernResult as the following:

    var document = new BsonDocument();
    document.Add("n", new BsonInt64(1));
    var writeConcernResult = new WriteConcernResult(document);
    

    Then you'll have to setup your mock repository to return this instance:

    _mockMongoProvider.Stub(p => p.Insert(user))
                      .Return(writeConcernResult );