JsMockito заглушает поле

#javascript #mocking

#javascript #издевательство

Вопрос:

У меня есть простой объект, над которым я издеваюсь, предположим, что-то вроде этого:

 function MyObject() {
    this.SomeVariable = "some-value";
    this.SomeFunction = function() { ... };
}
  

Теперь я хочу издеваться над переменной, что я и делал:

 var mockedObject = mock(MyObject);
when(mockedObject).SomeVariable.thenReturn("some-other-value");
  

Однако это говорит мне, что я не могу использовать thenReturn () для этого … не могу вспомнить точную ошибку, но кто-нибудь знает способ обойти это? Или я должен просто сделать:

 var mockedObject = mock(MyObject);
mockedObject.SomeVariable = "some-other-value";
  

Ответ №1:

Вы можете только заглушать или проверять взаимодействия (вызовы функций). Поскольку «someVariable» является атрибутом объекта, а не функцией в объекте, вы не можете заглушить или проверить его использование.

Итак, ваш вывод верен; вы должны просто предоставить значение, которое вы хотите, в качестве атрибута объекта:

 var mockedObject = mock(MyObject);
mockedObject.SomeVariable = "some-other-value";
  

Альтернативой, если это ваш собственный код, является изменение исходного объекта для использования вместо него функции в стиле «getter», например:

 function MyObject() {
    this.SomeVariable = function() { return "some-value"; };
    this.SomeFunction = function() { ... };
}
  

Для истинных «объектов» это часто лучший подход, чем использование атрибутов.

Комментарии:

1. Фактический объект — это, по сути, перечисление, вы поднимаете хороший вопрос о том, что, возможно, они должны быть функциями, хотя … спасибо за ответ!