Получение TypeError: Невозможно заглушить несуществующее собственное свойство при заглушке асинхронного метода. - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь написать модульные тесты для нашей небольшой, но скоро растущей библиотеки бизнес-функций testcafe - то есть библиотек, которые используют файлы подкачки, чтобы протестировать любую непростую логику.

С этой целью я пытаюсь написать свой первый модульный тест для этой функции. entityTabs - это импортированный асинхронный модуль, пользовательский интерфейс - импортированный неасинхронный модуль, accountAssignmentControls - файл подкачки. Те функции, упомянутые этим. определены далее в модуле. t - импорт тест-кафе.

Первоначально я хочу отключить все функции и проверить, что statAccountAssignments вызывается один раз (после этого я буду тестировать различные комбинации данных, которые передаются, но я не могу преодолеть первое препятствие).

I UNIT проверил нашу не-асинхронную библиотеку безголовых тестов, но

  • а) не асинхронный и
  • б) это был более старый узел, поэтому некоторые структуры и т. Д. Отличаются.

Один из разработчиков добавил некоторые модульные тесты, используя стул, мокко и синон - но они были для не асинхронных частей проекта (в основном, для обработки файлов), поэтому я не могу получить то, что он написал, для применения.

FUT

 async assignAccounts(assignments) {
    await entityTabs.startAccountAssignment();
    ui.logWithTimeStamp('WAiting for Account assignment dialog to appear', 2);
        await t
          .expect(accountAssignmentControls.accountAssignmentHeader.innerText)
          .contains('Account Assignment', 'Header contains Account Assignment');
        ui.logWithTimeStamp('Header visible waiting for accounts list', 2);
        await this.checkAccountList();

        const assignmentsCount = assignments.length;
        ui.logWithTimeStamp('Doing ' + assignmentsCount + ' assignments: ', 1);
        for (let i=0; i<assignmentsCount; i++) {
          ui.logWithTimeStamp(i + ': ' + JSON.stringify(assignments[i]), 1);
          if (assignments[i].type === 'credit') {
            await this.assignCreditAccount(assignments[i]);
          } else if (assignments[i].type === 'debit') {
            await this.assignDebitAccount(assignments[i]);
          } else {
            await this.assignFullAccount(assignments[i]);
          }
          ui.logWithTimeStamp('Assignment done', 3);
          await t.takeScreenshot();
        };
      }

текущий тест на провал

import chai from 'chai';
import sinon from 'sinon';
import sinonChai from 'sinon-chai';

import AccountAssignment from '../../business-functions/account-assignment';

let accountAssignmentControls;
// let busyLoader;
let entityTabs;
let ui;
let t;
// Register the sinon-chai extensions.
chai.use(sinonChai);
const expect = chai.expect;

// We must turn off the no-invalid-this rule because of how mocha uses this to be the current test fixture.
/* eslint no-invalid-this: "off" */

describe('business-functions - Account assignment', function() {
  describe('AccountAssignment class', function() {
    describe('assignAccounts', function() {
      let sandbox;

      before(() => {
        sandbox = sinon.sandbox.create();
      });

      after(() => {
        sandbox.restore();
      });

      describe('when one of each assignment', function() {
        it('starts assignment', async function() {
          const fakeResponse = 'dont care';

          const accountAssignment = new AccountAssignment();
          t = sinon.stub();
          entityTabs = sinon.stub();
          ui = sinon.stub();
          ui.logWithTimeStamp = sinon.stub();
          accountAssignmentControls = sinon.stub();
        //  let f = sinon.fake();
          let startAccountAssignment = sandbox
            .stub(entityTabs, 'startAccountAssignment')
            .resolves(fakeResponse);
         // sandbox.stub(t, 'expect');
          sandbox
            .stub(accountAssignment, 'checkAccountList')
            .resolves(fakeResponse);
          sandbox
            .stub(accountAssignment, 'assignCreditAccount')
            .resolves(fakeResponse);
          sandbox
            .stub(accountAssignment, 'assignDebitAccount')
            .resolves(fakeResponse);
          sandbox
            .stub(accountAssignment, 'assignFullAccount')
            .resolves(fakeResponse);
          sandbox
            .stub(accountAssignmentControls, 'accountAssignmentHeader')
            .resolves(fakeResponse);

          sandbox
            .stub(t, 'expect')
            .resolves(fakeResponse);
          sandbox
            .stub(t, 'contains')
              .resolves(fakeResponse);
          sandbox
            .stub(t, 'takeScreenshot')
              .resolves(fakeResponse);

          await accountAssignment.assignAccounts({});
          expect(startAccountAssignment).to.be.callledOnce;
        });
      });
    });
  });
});

который при запуске получает

TypeError: Невозможно заглушить несуществующее собственное свойство startAccountAssignment в Sandbox.stub (node_modules \ sinon \ lib \ sinon \ sandbox.js: 286: 19) в Context._callee $ (C: /Projects/Platform/PlatformTesting/UITests-NotProtractor/unit-tests/business-functions/account-assignment.tests.js: 49: 14) в tryCatch (node_modules \ регенератор-время выполнения \ runtime.js: 65: 40) в Generator.invoke [как _invoke] (node_modules \ регенератор-время выполнения \ runtime.js: 303: 22) в Generator.prototype. (анонимная функция) [как далее] (node_modules \ регенератор-время выполнения \ runtime.js: 117: 21) на этапе (юнит-тесты \ бизнес-функции \ account-assignment.tests.js: 21: 191) в C: \ Projects \ Platform \ PlatformTesting \ UITests-NotProtractor \ unit-tests \ business-functions \ account-assignment.tests.js: 21: 437 на новом Promise () в контексте. (Блок-тесты \ бизнес-функция \ счет-assignment.tests.js: 21: 99)

1 Ответ

0 голосов
/ 03 июля 2018

Вы корректно не заглушаете entityTabs, и модуль, который вы тестируете, не использует вашу заглушку.

Если быть более точным: вы объявили локальную переменную let entityTabs;, а затем присвоили эту переменную entityTabs = sinon.stub();. И, наконец, вы пытаетесь заглушить метод startAccountAssignment() для этого объекта, но у него нет такого свойства, потому что это не фактический entityTabs модуль / объект, а на основе включенных вами фрагментов кода, it это не тот, который модуль, который вы тестируете, даже будет использовать.

В зависимости от того, как написан объект entityTabs (находится ли он в своем собственном модуле? Является ли это синглтоном? Это класс?), Вам нужно будет импортировать его и отключить метод, который вы хотите смоделировать, или вы хотите использовать что-то вроде proxyquire для макетирования entityTabs.

...