Typemock Isolator: имитировать зависимость, которая не вводится? - PullRequest
4 голосов
/ 02 апреля 2012

Мой WidgetDoer класс зависит от Foo, который не вводится.Мне нужно подделать _foo реализацию DoStuffWith() (а затем проверить, что Do() вернул результат - это упрощенное представление моего реального кода).

public class WidgetDoer {
    readonly Foo _foo;

    public WidgetDoer() {
        _foo = new Foo();
    }

    public Bar Do(Widget widget) {
        var result = _foo.DoStuffWith(widget);
        return result;
    }
}

Я пыталсяиспользуйте следующий синтаксис Isolator для предотвращения создания реального объекта Foo (внутри конструктора WidgetDoer()), но в любом случае создается экземпляр реального объекта Foo:

var fooFake = Isolate.Fake.Instance<Foo>();
Isolate.WhenCalled(() => new Foo()).WillReturn(fooFake);

Можно ли использовать Typemock дляиздеваться над зависимостью, которая не вводится?

Ответы [ 3 ]

4 голосов
/ 03 апреля 2012

Этот код позволил мне смоделировать связанную зависимость:

Isolate.Swap.NextInstance<Foo>().With(FooFake);

Помните, TypeMock поддерживает очень мало типов из mscorlib .

2 голосов
/ 10 августа 2015

Заявитель Я работаю в Typemock.

Обмен экземпляров на некоторое время устарел. Вы можете использовать:

var fakeFoo = Isolate.Fake.NextInstance<Foo>();

fakeFoo - это прокси для _foo в вашем коде.

Вы также можете использовать:

var fakeFoo = Isolate.Fake.AllInstances<Foo>();

Здесь fakeFoo - это прокси для всех экземпляров Foo, которые были созданы (новые) из этой строки.

Оба примера создают fake и " swap " в одной команде.

0 голосов
/ 22 мая 2012

Во-первых, при работе с API-интерфейсом TypeMock Isolatar я настоятельно рекомендую иметь этот PDF-файл рядом с собой: Краткое руководство по API-интерфейсу TypeMock (PDF)

Что касается вышеприведенного пункта, да, я нахожу обычной ошибкой то, что создание фальшивки не означает, что к ней привыкли. Как вы указали выше, чтобы использовать его, вы должны сделать что-то вроде:

Isolate.Swap.NextInstance<Foo>().With(FooFake);

Это поменяет следующий экземпляр. Я уверен, что вы также можете сделать:

Isolate.Swap.NextInstance<Foo>().With(FooFake);
Isolate.Swap.NextInstance<Foo>().With(FooFake2);

Это приведет к смене следующего создания объекта с экземпляром FooFake, а затем с FooFake2

Вы также можете сделать это:

Isolate.Swap.AllInstances<Foo>().With(FooFake);

Это заменит ВСЕ будущее создание объекта на фальшивку. Это очень полезно, если вы смотрите на код, в котором может быть неочевидно, сколько раз будет происходить создание объекта.

...