В феврале 2017 года они объединили PR, добавив эту функцию, выпущенную в апреле 2017 года.
так что, чтобы следить за геттерами / сеттерами, которые вы используете:
const spy = spyOnProperty(myObj, 'myGetterName', 'get');
где myObj - ваш экземпляр, myGetterName - это имя того, которое определено в вашем классе as, get myGetterName() {}
а третий параметр - это тип get
или set
.
Вы можете использовать те же утверждения, которые вы уже используете для шпионов, созданных с помощью spyOn
.
Так вы можете, например:
const spy = spyOnProperty(myObj, 'myGetterName', 'get'); // to stub and return nothing. Just spy and stub.
const spy = spyOnProperty(myObj, 'myGetterName', 'get').and.returnValue(1); // to stub and return 1 or any value as needed.
const spy = spyOnProperty(myObj, 'myGetterName', 'get').and.callThrough(); // Call the real thing.
Вот строка в исходном коде github, где этот метод доступен, если вам интересно.
https://github.com/jasmine/jasmine/blob/7f8f2b5e7a7af70d7f6b629331eb6fe0a7cb9279/src/core/requireInterface.js#L199
Отвечая на исходный вопрос с помощью jasmine 2.6.1, вы должны:
const spy = spyOnProperty(myObj, 'valueA', 'get').andReturn(1);
expect(myObj.valueA).toBe(1);
expect(spy).toHaveBeenCalled();
valueA
естьObservable
илиSubject
? Я получаюProperty valueA does not have access type get
По какой причине вы не можете просто изменить это на объекте напрямую? Это не значит, что javascript обеспечивает видимость свойства объекта.
источник
spyOn
явно указывает, что я хочу что-то имитировать, тогда как я напрямую устанавливаю свойство, неявно указывает, что я хочу что-то имитировать, и я не уверен, что кто-то еще поймет, что я издеваюсь над чем-то, когда он читает код. Другой случай заключается в том, что я не хочу изменять внутреннее поведение объекта, например, если я изменяю свойство length для массива, массив обрезается, так что макет будет лучшеspyOn
.spyOn
не проходит тест, если свойство не существует.TypeError: Cannot assign to read only property 'sessionStorage' of object '#<Window>'
Жасмин не имеет такой функции, но вы можете что-то вместе взломать, используя
Object.defineProperty
.Вы можете реорганизовать свой код, чтобы использовать функцию получения, а затем шпионить за получателем.
источник
and.returnValue(1)
Лучше всего использовать
spyOnProperty
. Он ожидает 3 параметра, и вам нужно передатьget
илиset
в качестве третьего параметра.пример
Здесь я устанавливаю
get
изclientWidth
изdiv.nativeElement
объекта.источник
Если вы используете ES6 (Babel) или TypeScript, вы можете заглушить свойство, используя методы доступа get и set.
Затем в своем тесте вы можете проверить, что свойство установлено с помощью:
источник
Правильный способ сделать это - использовать свойство spy on, это позволит вам смоделировать свойство объекта с определенным значением.
источник
Предположим, существует такой метод, который требует тестирования. Необходимо проверить
src
свойство крошечного изображения.Приведенный ниже spyOn () заставляет «новое изображение» загружать поддельный код из теста, код spyOn возвращает объект, который имеет только свойство src
Поскольку область видимости переменной "hook" видна в поддельном коде в SpyOn, а также позже после вызова "reportABCEvent"
Это для jasmine 1.3, но может работать и на 2.0, если "andCallFake" заменить на имя 2.0.
источник
Я использую сетку кендо и поэтому не могу изменить реализацию на метод получения, но я хочу протестировать это (имитируя сетку), а не тестировать саму сетку. Я использовал объект-шпион, но он не поддерживает насмешку над свойствами, поэтому я делаю следующее:
Это немного затянуто, но работает приятно
источник
Я немного опоздал на вечеринку, я знаю, но,
Вы можете напрямую получить доступ к объекту вызовов, который может предоставить вам переменные для каждого вызова
источник
Вы не можете имитировать переменную, но вы можете создать для нее функцию получения и смоделировать этот метод в своем файле спецификации.
источник