Подтвердить что ты не робот

С помощью Moq вы можете проверить вызов метода с анонимным типом?

Я пытаюсь проверить вызов метода с помощью Moq, но я не могу правильно получить синтаксис. В настоящее время я использую это как подтверждение:

repository.Verify(x => x.ExecuteNonQuery("fav_AddFavorites", new
{
    fid = 123,
    inputStr = "000456"
}), Times.Once());

Код компилируется, но с ошибкой выполняется ошибка:

Expected invocation on the mock once, but was 0 times: 
x => x.ExecuteNonQuery("fav_AddFavorites", new <>f__AnonymousType0<Int32, String>(123, "000456"))
No setups configured.

Performed invocations:
IRepository.ExecuteNonQuery("fav_AddFavorites", { fid = 123, inputStr = 000456 })

Как проверить вызов метода и сопоставить параметры метода для анонимного типа.

UPDATE

Чтобы ответить на вопросы:

Я пытаюсь проверить, как вызван метод, и что параметры верны.

Подпись метода, который я пытаюсь проверить:

int ExecuteNonQuery(string query, object param = null);

Код настройки просто:

repository = new Mock<IRepository>();

ОБНОВЛЕНИЕ 2

Похоже, что это проблема с Moq и как она обрабатывает анонимные типы в .Net. Код, написанный Полом Матовичем, отлично работает, однако, как только код и тест находятся в разностных сборках, тест терпит неудачу.

4b9b3361

Ответ 1

Эти проходы

        public class Class1
    {
        private Class2 _Class2;
        public Class1(Class2 class2)
        {
            _Class2 = class2;
        }

        public void DoSomething(string s)
        {
            _Class2.ExecuteNonQuery(s, new { fid = 123,  inputStr = "000456" });
        }
    }

    public class Class2
    {
        public virtual void ExecuteNonQuery(string s, object o)
        {
        }
    }

    /// <summary>
    ///A test for ExecuteNonQuery
    ///</summary>
    [TestMethod()]
    public void ExecuteNonQueryTest()
    {
        string testString = "Hello";
        var Class2Stub = new Mock<Class2>();
        Class1 target = new Class1(Class2Stub.Object);
        target.DoSomething(testString);
        Class2Stub.Verify(x => x.ExecuteNonQuery(testString, It.Is<object>(o => o.Equals(new { fid = 123, inputStr = "000456" }))), Times.Once());
    }

Update

Это странно, но это не работает в разных сборках. Кто-то может дать нам длинное определение о том, почему object.equals из разных сборок ведут себя по-разному, но для разных сборок это будет работать, любая дисперсия значений объекта вернет другой хеш-код.

        Class2Stub.Verify(x => x.ExecuteNonQuery(testString, It.Is<object>(o => o.GetHashCode() == (new { fid = 123, inputStr = "000456" }).GetHashCode())), Times.Once());

Ответ 2

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

aMock.Setup(x => x.Method(It.IsAny<object>())).Callback<object>(
  (p1) =>
    {
      dynamic o = p1;
      Assert.That(o.Name, Is.EqualTo("Bilbo"));
    });