Модульное тестирование спецификации c MongoDb FilterDefintion в C# с Moq - PullRequest
0 голосов
/ 17 февраля 2020

Попытка модульного тестирования следующей функции обновления MongoDb в C#.

var update = Builders<InvestorMongoDao>.Update
      .Set(x => x.EmailAddress, command.EmailAddress);

await this.myDatabase.Users
.UpdateOneAsync(x => x.UserId == userId), update)
.ConfigureAwait(false);

Я могу легко проверить, вызывается ли эта функция с помощью универсального c фильтра:

this.mockCollection
    .Verify(x => x.UpdateOneAsync(It.IsAny<FilterDefinition<MyDao>>(), 
        It.IsAny<UpdateDefinition<MyDao>>(), 
        It.IsAny<UpdateOptions>(), 
        It.IsAny<CancellationToken>()));

Однако я хочу попробовать и убедиться, что он вызывается с ожидаемым параметром. Я не могу найти способ извлечь параметр, который я хочу проверить из FilterDefinition. Я пробовал это:

var foo = Builders<MyDao>.Filter.Eq("UserId", expectedUserId);
this.mockCollection
    .Verify(x => x.UpdateOneAsync(It.Is<FilterDefinition<MyDao>>(a => a == foo), 
        It.IsAny<UpdateDefinition<MyDao>>(), 
        It.IsAny<UpdateOptions>(), 
        It.IsAny<CancellationToken>()));

Но тест утверждает, что вызов не выполняется. Что я делаю не так?

1 Ответ

0 голосов
/ 17 февраля 2020

Похоже, что вы можете приблизить то, что здесь необходимо, используя Render.

var serializerRegistry = BsonSerializer.SerializerRegistry;
var documentSerializer = serializerRegistry.GetSerializer<MyDao>();
var expectedFilter = Builders<MyDao>.Filter.Eq("UserId", existingInvestor2.InvestorId);

this.mockCollection
    .Verify(x => x.UpdateOneAsync(It.Is<FilterDefinition<MyDao>>(a => a.Render(documentSerializer, serializerRegistry) == expectedFilter.Render(documentSerializer, serializerRegistry)), 
        It.IsAny<UpdateDefinition<MyDao>>(), 
        It.IsAny<UpdateOptions>(), 
        It.IsAny<CancellationToken>()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...