Требования Moq?Поражает цель? - PullRequest
3 голосов
/ 04 мая 2011

Не требуется ли для виртуализации всех средств доступа к свойствам, которые вы хотите издеваться, своего рода победа с целью насмешки?

Я имею в виду, если мне придется модифицировать свой объект и виртуализировать каждый отдельный аксессор, который я хочу высмеять, разве я не могу так же унаследовать свой класс и сам издеваться над ним?

1 Ответ

3 голосов
/ 04 мая 2011

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

Таким образом, макет фреймворка, чтобы иметь возможность имитировать членов класса, должен наследовать от класса и переопределять поведение члена в соответствии с запросом, и для этой цели будут работать только виртуальные члены.

Например.если у вас есть (я показываю методы, но то же самое относится и к свойствам)

class Foo
{
    public void Bar()
    {

    }
    public virtual void  virtualBar()
    {

    }
}

, тогда mock Framework, вероятно, создает что-то подобное для mock

public class MockFoo : Foo
{
    public override void virtualBar()
    {
        // mockery action
    }

    public new void Bar()
    {
        // mockery action
    }
}

Теперь, когда у вас есть

Foo foo = GetMockObject(); // you get an instance of MockFoo

теперь, когда вы вызываете

foo.Bar();

, вы не намерены вызывать фактическую реализацию, но, поскольку это не виртуальный член, он будет вызывать Foo 's Bar()

с другой стороны, вызов

foo.VirtualBar();

вызовет MockFoo 'VirtualBar(), так как это виртуальный член, поведение которого будет введено фиктивной структуройв соответствии с просьбой.

...