Как проверить параметры типа объекта в Moq - PullRequest
1 голос
/ 12 апреля 2019

Я хочу проверить выполнение метода с анонимным параметром, но с известными свойствами.

public interface IToTest
{
   void MethodToTest(object data);
}

Вот как я пытаюсь добиться этого:

Mocker.Mock<IToTest>
   .Verify(x=>x.MethodToTest(
      It.Is<object>(
         obj=>obj.Equals(new { DataProperty = "Test"})
      )),
      Times.Once());

Тест не проходит.

Я не хочу использовать

It.IsAny<object>()

, потому что я знаю ожидаемые данные.

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

Вам нужно будет использовать рефлексию в делегате, чтобы сделать ваши сравнения, или использовать что-то вроде FluentAssertions, чтобы разгрузить тяжелую работу

например

//...

var expected = new { 
    DataProperty = "Test" 
    //...known properties
};

Func<object, bool> match = _ => {
    _.Should().BeEquivalentTo(expected);
    return true;
};

Mocker.Mock<IToTest>
    .Verify(x =>
        x.MethodToTest(It.Is<object>(obj => match(obj))),
        Times.Once());

В качестве альтернативы вы могли бы вместо этого захватить параметр объекта в обратном вызове и просто подтвердить захваченный аргумент с помощью беглых утверждений.

1 голос
/ 12 апреля 2019

Ваш текущий делегат проверяет, что весь объект obj равен объекту анонимного типа new { DataProperty = "Test"} - что вряд ли будет проверять то, что вы хотите.

Что вынужно убедиться, что:

1) obj имеет свойство с именем, которое вы ожидаете.

2) это свойство имеет значение, которое вы ожидаете.

Используя отражение, вы можете выполнить обе проверки следующим образом:

Mocker.Mock<IToTest>
   .Verify(x => x.MethodToTest(
       It.Is<object>(
           obj => 
               obj.GetType().GetProperty("PropertyOne") != null &&
               obj.GetType().GetProperty("PropertyOne").GetValue(obj).ToString() == "Test"
       )),
       Times.Once());

Важное примечание - не забывайте проверку NULL на результат GetProperty() для случаев, когда свойство делаетне существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...