Moq: как вызвать событие с ненулевым отправителем

Рассмотрим этот интерфейс:

public interface IFoo
{
   event EventHandler SomethingHappened;
}

С Moq я делаю макет интерфейса, и теперь я хочу поднять событие:

var myMock = new Mock<IFoo>();
myMock.Raise(x => x.SomethingHappened += null, EventArgs.Empty );

Это работает отлично, но проблема в том, что подписчик ожидает, что sender будет чем-то (на самом деле IFoo, который вызывает событие), а не просто null.

Поэтому я хочу поднять событие следующим образом:

myMock.Raise(x => x.SomethingHappened += myMock.Object, EventArgs.Empty );

но компилятор этого не допустит - похоже, он принимает только null в качестве отправителя. Почему это? Есть ли способ сделать то, что я действительно хочу?


person Martin Christiansen    schedule 10.10.2016    source источник
comment
Какая у вас ошибка? И что такое подпись SomethingHappened ?   -  person meJustAndrew    schedule 10.10.2016
comment
Попробуйте myMock.Raise(x=>x.SomethingHappened += null,myMock.Object, EventArgs.Empty );. x=>x.SomethingHappened += null, это сообщит Mock, какое событие вызывать, остальные аргументы, как и ожидалось   -  person Mrinal Kamboj    schedule 10.10.2016


Ответы (2)


Предполагая, что вы используете .Net 4.5, есть изменение в определении делегата EventHandler<TEventArgs>, проверьте ссылки для 4.5 и 4.0, это гарантирует, что, несмотря на то, что вы используете тип IFoo, который не может быть назначен из EventArgs, компилятор все равно не будет жаловаться, как это было бы в 4.0, но другим аспектом будет структура Moq. рассматривайте событие как стандартный делегат, а не шаблон события, который нужно вызывать как:

myMock.Raise(x=>x.SomethingHappened += null,myMock.Object, EventArgs.Empty);

x.SomethingHappened += null, которые сообщают платформе Moq, какое событие/делегат для вызова и отдыха будет стандартным аргументом в форме object sender, EventArgs e

person Mrinal Kamboj    schedule 10.10.2016
comment
Большое спасибо за прекрасное объяснение :-). Да, я использую .Net 4.5. - person Martin Christiansen; 10.10.2016
comment
Добро пожаловать, тогда вы должны принять правильный и полный ответ. - person Mrinal Kamboj; 10.10.2016

вы можете передать (отправитель объекта, EventArgs e) для SomethingHappened, как показано ниже, что позволит подписчику узнать, что отправитель является вашим объектом moq IFoo

myMock.Raise(x=>x.SomethingHappened += null,myMock.Object, EventArgs.Empty );
person inan    schedule 10.10.2016
comment
Эй, это работает - спасибо, чувак! Кажется, меня смутил нуль. Я предположил, что в качестве параметра отправителя был передан нуль, но, похоже, это не так. Но что тогда означает ноль? Почему это необходимо? - person Martin Christiansen; 10.10.2016
comment
Вам нужно сначала понять причину, почему это происходит, а также, если вы заметили, я прокомментировал ответ в комментариях, намного заранее. Проверьте мой ответ и задайте любые сомнения, которые могут у вас возникнуть. - person Mrinal Kamboj; 10.10.2016