Скажите, что у меня есть интерфейс, который имеет как свойство другой интерфейс. Что-то как:
interface IOne
{
ITwo Two { get; set;}
}
И я создаю насмешку для ITwo
и затем создайте насмешку для IOne
использование Mock<ITwo>.Object
. Как я могу сгенерировать событие на ITwo
когда у меня только есть ссылка на IOne
или Mock<IOne>
? Мне нужна ссылка для Mock<ITwo>
, но как я могу бросить от ITwo
кому: Mock<ITwo>
? Я надеюсь, что это ясно :)
Спасибо.
править:
Я надеюсь, что это экс-более вполне достаточное более ясно:
interface IHuman
{
void Sneeze();
INose Nose { get; set;}
}
interface INose
{
event EventHandler Irritated;
}
class ToBeTested
{
private IHuman _human;
public ToBeTested(IHuman human)
{
_human = human;
_human.Nose.Irritated += NoseIrritated;
}
void NoseIrritated(object sender, EventArgs e)
{
_human.Sneeze();
}
}
Я хочу смочь получить доступ к Насмешке от Насмешки. Таким образом, я могу сделать somethiong как:
noseMock.Raise(nose => nose.Irritated += null);
humanMock.Verify(human => human.Sneeze());
Я все еще не полностью уверен, о чем вы спрашиваете, но похоже, что вы пытаетесь выяснить, как перейти от объекта с имитацией к обертке Mock
, которая его создала? ("как я могу привести из ITwo
к Mock
?")
Это довольно просто: есть метод Mock.Get
, который находит Mock
для T (если этот объект пришел из Moq).
Mock<ITwo> mockTwo = Mock.Get(two);
Подробности можно найти в руководстве по началу работы с Moq:
http://code.google.com/p/moq/wiki/QuickStart#Advanced_Features
Из самих интерфейсов вы не можете создавать события, поскольку интерфейсы не могут содержать код, а только контракты. Если вы хотите обмениваться данными между объектами, реализующими IOne и ITwo, лучший способ - действительно добавить приемник событий и зарегистрироваться для этого события из любой из реализаций.
Но: вы не можете сделать это автоматически через только интерфейсы.
Вы тем временем отредактировали свой вопрос. Что для вас Mock
? Вы не можете разыграть из ITwo
на Mock
. Обратное может быть возможно, если Mock
наследуется от ITwo
.
Примечание: возможно, пример со словами, отличными от «Один» и «Два», может помочь нам понять, что вам на самом деле нужно?
Ответ только «Как я могу инициировать событие на ITwo, когда у меня есть только ссылка на IOne или Mock ", надеюсь, я немного понимаю, что вам нужно:
interface IOne
{
void RaiseEventITwo();
ITwo Two { get; set;}
}
// note: left out some details
class One : IOne
{
public One() { this.Two = new Two(); } // Two implements ITwo
public void RaiseEventITwo()
{
this.Two.OnLoadPage(); // i.e.: some event of ITwo is OnLoadPage
}
}
// somewhere where you actually have the reference you speak off
IOne one = new One(); // class One implements IOne
one.RaiseEventITwo();
// using the Mock<T> class:
Mock<IOne> mockOne = new Mock<IOne>();
mockOne.GetIOne().RaiseEventITwo(); // GetIOne needs to be implemented in
// Mock<T> or as extension for Mock<T>