#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. Фактический объект — это, по сути, перечисление, вы поднимаете хороший вопрос о том, что, возможно, они должны быть функциями, хотя … спасибо за ответ!