Как получить доступ к фиктивному объекту в другом фиктивном объекте в Moq - PullRequest
1 голос
/ 15 июля 2010

Скажем, у меня есть интерфейс, который имеет в качестве свойства другой интерфейс.Что-то вроде:

interface IOne  
{  
    ITwo Two { get; set;}   
}  

И я создаю макет для ITwo, а затем создаю макет для IOne, используя Mock<ITwo>.Object.Как я могу вызвать событие на ITwo, если у меня есть только ссылка на IOne или Mock<IOne>?Мне нужна ссылка для Mock<ITwo>, но как я могу разыграть от ITwo до Mock<ITwo>?Я надеюсь, что все ясно:)

Спасибо.

edit:

Надеюсь, этот пример более понятен:

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();
    }
}

Я хочу быть в состояниичтобы получить доступ к Mock от Mock.Так что я могу сделать что-то вроде:

noseMock.Raise(nose => nose.Irritated += null);
humanMock.Verify(human => human.Sneeze());

Ответы [ 2 ]

2 голосов
/ 17 июля 2010

Я до сих пор не полностью уверен, что вы просите, но похоже, что вы пытаетесь понять, как добраться от насмешливого объекта до оболочки Mock<T>, которая его произвела?(«Как я могу привести от ITwo к Mock<ITwo>?»)

Это довольно просто: есть метод Mock.Get, который находит Mock<T> для T (если этот объект пришел изMoq).

Mock<ITwo> mockTwo = Mock.Get(two);

Подробности можно найти в руководстве по началу работы с Moq:

http://code.google.com/p/moq/wiki/QuickStart#Advanced_Features

0 голосов
/ 15 июля 2010

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

Редактировать

Вы тем временем редактировали свой вопрос.Что такое Mock<T> для вас?Вы не можете разыграть от ITwo до Mock<T>.Обратное может быть возможным, если Mock<T> наследуется от 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>
...