2013-09-21 4 views
11

Я пытаюсь использовать moq для записи модульного теста. Вот мой код модульного кодаMoq: Недействительный обратный вызов. Настройка метода с параметрами не может вызвать обратный вызов с параметрами

 var sender = new Mock<ICommandSender>(); 
     sender.Setup(m => m.SendCommand(It.IsAny<MyCommand>(), false)) 
       .Callback(delegate(object o) 
       { 
        var msg = o as MyCommand; 
        Assert.AreEqual(cmd.Id, msg.Id); 
        Assert.AreEqual(cmd.Name, msg.Name); 
       }) 
       .Verifiable(); 

SendCommand принимает объект и необязательный логический параметр. И MyCommand происходит от ICommand.

void SendCommand(ICommand commands, bool idFromContent = false); 

При запуске теста, я вижу ошибку

System.ArgumentException : Invalid callback. Setup on method with parameters (ICommand,Boolean) cannot invoke callback with parameters (Object). 

Я хочу, чтобы проверить, если содержание сообщения является то, что я послал. Я искал форум и нашел несколько различных вариаций этой проблемы, но это не помогло. Любая помощь приветствуется.

ответ

20

Необходимо вызвать общую перегрузку обратного вызова с конкретными типами, ожидаемыми методом. Следующие должны работать:

sender.Setup(x => x.SendCommand(It.IsAny<MyCommand>(), false)) 
     .Callback<ICommand, bool>((command, idFromContent) => 
      { 
       var myCommand = command as MyCommand; 
       Assert.That(myCommand, Is.Not.Null); 
       Assert.That(myCommand.Id, Is.EqualTo(cmd.Id)); 
       Assert.That(myCommand.Name, Is.EqualTo(cmd.Name)); 
      }) 
     .Verifiable(); 

Если утверждения сбой в функции обратного вызова, то тест не сразу, поэтому призыв к проверке() (и, предположительно, последующий вызов для проверки()) представляется излишним. Если вы хотите разрешить посмеянный вызов отправки, даже если он не соответствует критериям, а затем проверить его после факта, вы можете сделать это вместо этого (после вызова метода проверки):

sender.Verify(x => x.SendCommand(It.Is<MyCommand>(c => 
    { 
     Assert.That(c, Is.Not.Null); 
     Assert.That(c.Id, Is.EqualTo(cmd.Id)); 
     Assert.That(c.Name, Is.EqualTo(cmd.Name)); 
     return true; 
    }), false), Times.Once()); 
Смежные вопросы