Как получить доступ к фиктивному объекту в другом фиктивном объекте в Moq

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

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());
1
задан Colin Anderson 15 July 2010 в 15:37
поделиться

2 ответа

Я все еще не полностью уверен, о чем вы спрашиваете, но похоже, что вы пытаетесь выяснить, как перейти от объекта с имитацией к обертке 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

2
ответ дан 2 September 2019 в 23:02
поделиться

Из самих интерфейсов вы не можете создавать события, поскольку интерфейсы не могут содержать код, а только контракты. Если вы хотите обмениваться данными между объектами, реализующими 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>
0
ответ дан 2 September 2019 в 23:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: