TargetParameterCountException в модульном тесте на основе Moq - PullRequest
3 голосов
/ 02 августа 2009

У нас есть репозитории, в которых есть метод «Сохранить». Они также генерируют событие «Создано» всякий раз, когда объект сохраняется.

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

var IRepository = new Mock<IRepository>();
Request request = new Request();
IRepository.Setup(a => a.Save(request)).Raises(a => a.Created += null, RequestCreatedEventArgs.Empty);

Это не похоже на работу, и я всегда получаю исключение:

System.Reflection.TargetParameterCountException: Несоответствие количества параметров.

Любой пример насмешливых событий с Moq был бы полезен.

Ответы [ 2 ]

3 голосов
/ 15 сентября 2009

Стандартный делегат типа события обычно имеет два аргумента: объект отправителя и объект подкласса EventArgs. Moq ожидает эту подпись от вашего события, но находит только один аргумент, и это вызывает исключение.

Посмотрите на этот код с моим комментарием, он должен работать:

    public class Request
    {
        //...
    }

    public class RequestCreatedEventArgs : EventArgs
    { 
        Request Request {get; set;} 
    } 

    //=======================================
    //You must have sender as a first argument
    //=======================================
    public delegate void RequestCreatedEventHandler(object sender, RequestCreatedEventArgs e); 

    public interface IRepository
    {
        void Save(Request request);
        event RequestCreatedEventHandler Created;
    }

    [TestMethod]
    public void Test()
    {
        var repository = new Mock<IRepository>(); 
        Request request = new Request();
        repository.Setup(a => a.Save(request)).Raises(a => a.Created += null, new RequestCreatedEventArgs());

        bool eventRaised = false;
        repository.Object.Created += (sender, e) =>
        {
            eventRaised = true;
        };
        repository.Object.Save(request);

        Assert.IsTrue(eventRaised);
    }
0 голосов
/ 04 сентября 2009

Похоже, что все, что возвращается из RequestCreatedEventArgs.Empty, не может быть преобразовано в RequestCreatedEventArgs объект. Я ожидал бы следующее:

class IRepository
{ 
    public event THING Created; 
}
class THING : EventArgs
{ 
    public static THING Empty 
    { 
        get { return new THING(); } 
    } 
}

Убедитесь, что THING - это один и тот же класс в каждом месте вашего кода, как показано выше.

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