Как проверить, что макет асинхронного метода вызывается с правильным выражением? - PullRequest
0 голосов
/ 21 февраля 2019

Я написал несколько тестов, используя XUnit и Moq.Один из методов реализации макета интерфейса принимает параметр типа Expression<Func<T, bool>> Кажется, все работает хорошо, но у меня проблемы с пониманием работы проверки того, что метод вызывается с правильным выражением.

Учитывая следующеетест, метод не возвращает значение, указанное в настройке, даже если вызов кажется правильным.1009 * Когда я изменяю свою настройку следующим образом, я получаю результат, но в моей функции проверки говорится, что функция никогда не вызывается (или, по крайней мере, с данным выражением).:

crudService.Setup(crud => crud.GetEntitiesAsync(It.IsAny<Expression<Func<DefinitionType, bool>>>()))
    .Returns(Task.FromResult<IEnumerable<DefinitionType>>(new List<DefinitionType> {
        new DefinitionType {
            Name = "Test",
            Description = "Test",
            DisplayName = "Test",
            ID = Guid.NewGuid()
        } }));

Сейчас я также изменил проверку на более общую:

crudService.Verify(crud => crud.GetEntitiesAsync(It.IsAny<Expression<Func<DefinitionType, bool>>>()), Times.Once);

Теперь мой тест пройден, но я действительно хочу убедиться, что метод вызывается правильно, а невызывается на всех.Как мне решить это самым простым / лучшим способом?

1 Ответ

0 голосов
/ 21 февраля 2019

Вам нужно будет более конкретно указать выражение, используемое в настройке.

Использовать It.Is<T>() и вызвать выражение для настройки и проверки.

[Theory(DisplayName = "Definition Types service - Create")]
[MemberData(nameof(DefinitionTypesTestData.SingleDefinitionType), MemberType = typeof(DefinitionTypesTestData))]
public async Task CreateDefinitionTypeShouldThrowDuplicateTest(DefinitionType obj) {

    if (obj == null) throw new NullReferenceException($"Test data was null in theory 'Definition Types service - Create'");

    //Arrange
    var crudService = new Mock<IEntityCrudService<DefinitionType>>();

    var list = new List<DefinitionType>() {
        new DefinitionType {
            Name = "Test",
            Description = "Test",
            DisplayName = "Test",
            ID = Guid.NewGuid()
        }
    };

    crudService
        .Setup(_ => _.GetEntitiesAsync(It.Is<Expression<Func<DefinitionType, bool>>>(exp => exp.Compile()(obj))))
        .ReturnsAsync(list);

    IDefinitionTypesService serviceUnderTest = new DefinitionTypesService(crudService.Object);

    //Act
    var exception = await Assert.ThrowsAsync<EntityDuplicationException>(() => serviceUnderTest.InsertDefinitionTypeAsync(obj));

    //Assert
    Assert.Contains("Definition type", exception.DisplayMessage);
    Assert.Contains(obj.Name, exception.DisplayMessage);
    crudService.Verify(_ => _.GetEntitiesAsync(It.Is<Expression<Func<DefinitionType, bool>>>(exp => exp.Compile()(obj))), Times.Once);
    crudService.VerifyNoOtherCalls();
}

Обратите особое вниманиек выражению, используемому при настройке и проверке.

_ => _.GetEntitiesAsync(It.Is<Expression<Func<DefinitionType, bool>>>(exp => exp.Compile()(obj)))
...