Как я дразню частное поле?

Чтобы исключить теги разметки:

"(?<=<pre>)(.*?)(?=</pre>)"
16
задан SCdF 25 February 2009 в 06:29
поделиться

6 ответов

Я почти цитирую методы от "Работа Эффективно с Унаследованным кодом" :

  1. Подкласс Ваш класс в модульном тесте и заменяют Вашу частную переменную с фиктивным объектом в нем (путем добавления общедоступного метода set или в конструкторе). Вероятно, необходимо сделать переменную защищенной.
  2. Делают защищенного метода get для этой частной переменной и переопределяют его в тестировании подкласса для возврата фиктивного объекта вместо фактической частной переменной.
  3. Создают защищенный метод фабрики для создания ISnapshot объект и переопределяют его в тестировании подкласса для возврата экземпляра фиктивного объекта вместо реального. Таким образом, конструктор получит правильное значение от запуска.
  4. Параметризуют конструктора для взятия экземпляра ISnapshot.
22
ответ дан 30 November 2019 в 21:11
поделиться

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

2
ответ дан 30 November 2019 в 21:11
поделиться

Я не уверен, что можно сделать это. Если Вы желаете протестировать _next тогда, Вы, вероятно, оказываетесь перед необходимостью передавать его в в качестве параметра и затем в Вашей передаче модульного теста в Фиктивном объекте, который можно тогда протестировать использование Ожидания. Это - то, что я сделал бы, если бы я пытался сделать это в Moq.

Как пример того, что я мог бы попытаться использовать платформу Moq:

Mock<ISnapshot> snapshotMock = new Mock<ISnapshot>();
snapshotMock.Expect(p => p.FreezeFrom(expectedUpdate)).AtMostOnce();
Cache c = new Cache(snapshotMock.Object);
c.Freeze(expectedUpdate);

Примечание: Я не попытался скомпилировать вышеупомянутый код. Его просто там для предоставления примера того, как я приблизился бы к решению этого.

3
ответ дан 30 November 2019 в 21:11
поделиться

Этот ответ мог бы быть простым, но рассмотрение кода, там какой-либо путь, которым ISnapshot.FreezeFrom(IUpdates) не будет названным? Кажется, что Вы хотите утверждать что-то, что всегда будет верно.

, Поскольку Jason говорит, насмешка предназначена для ситуаций, где Ваш класс зависит от SomeInterface, чтобы сделать, это - работа, и Вы хотите протестировать YourClass в изоляции от того, какой бы ни реализация SomeInterface Вы на самом деле используете во времени выполнения.

1
ответ дан 30 November 2019 в 21:11
поделиться

Возникает вопрос: каковы будут внешние видимые эффекты, если это сработает?

Что происходит со всеми этими снимками? Один из вариантов - инициализировать кэш с его первым снимком извне, скажем, в конструкторе. Другой вариант - издеваться над тем, что вызывает моментальный снимок и имеет значение вне кеша. Это зависит от того, что вам небезразлично.

1
ответ дан 30 November 2019 в 21:11
поделиться

Возможно, уже слишком поздно отвечать. В любом случае. У меня тоже была похожая проблема.

public class Model
{
  public ISomeClass XYZ{
      get;
      private set;
      }
}

Я потребовал установить значение XYZ в моем тестовом примере. Я решил проблему с помощью этого синтекса.

Expect.Call(_model.XYZ).Return(new SomeClass());
_repository.ReplayAll();

В приведенном выше случае мы можем сделать это следующим образом

Expect.Call(_cache.LatestSnapshot).Return(new Snapshot());
_repository.ReplayAll();
1
ответ дан 30 November 2019 в 21:11
поделиться
Другие вопросы по тегам:

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