Async await Getting TypeError:在存根异步方法时无法存根不存在的own属性

Async await Getting TypeError:在存根异步方法时无法存根不存在的own属性,async-await,mocha.js,sinon,chai,testcafe,Async Await,Mocha.js,Sinon,Chai,Testcafe,我正在尝试为我们的testcafe业务函数库编写单元测试,这些函数库很小,但很快就会发展起来,即使用页面文件测试任何非简单逻辑的函数库 为此,我试图为这个函数编写我的第一个单元测试 entityTabs-是一个导入的异步模块,ui是一个导入的非异步模块,accountAssignmentControls是一个页面文件。这篇文章提到的那些功能。在模块中进一步定义。 t是一个testcafe导入 最初,我想剔除所有函数,并测试statAccountAssignments调用一次(之后,我将测试传入的

我正在尝试为我们的testcafe业务函数库编写单元测试,这些函数库很小,但很快就会发展起来,即使用页面文件测试任何非简单逻辑的函数库

为此,我试图为这个函数编写我的第一个单元测试 entityTabs-是一个导入的异步模块,ui是一个导入的非异步模块,accountAssignmentControls是一个页面文件。这篇文章提到的那些功能。在模块中进一步定义。 t是一个testcafe导入

最初,我想剔除所有函数,并测试statAccountAssignments调用一次(之后,我将测试传入的数据的各种组合,但我无法超越第一个障碍)

我对我们的非异步无头测试库进行了单元测试,但是

  • a) 这是非异步的,并且
  • b) 它是较旧的节点,因此某些结构等是不同的
其中一位开发人员添加了一些使用chair、mocha和sinon的单元测试,但这些测试是针对项目的非异步部分(主要是文件处理),因此我无法得到他编写的应用程序

未来

什么时候跑步

TypeError:无法存根不存在的自有属性startAccountAssignment 在Sandbox.stub(节点\u modules\sinon\lib\sinon\Sandbox.js:286:19) 在上下文中。_callee$(C:/Projects/PlatformTesting/UITests-notpregrator/unittests/businessfunctions/accountassignment.tests.js:49:14) 在tryCatch(节点\模块\再生器运行时\运行时.js:65:40) 在Generator.invoke[as _invoke](node_modules\registrator runtime\runtime.js:303:22) 在Generator.prototype.(匿名函数)[as next](节点\模块\再生器运行时\运行时.js:117:21) 步骤(单元测试\业务功能\帐户分配.tests.js:21:191) 在C:\Projects\PlatformTesting\UITests notgrandor\unittests\business functions\account assignment.tests.js:21:437 在新的承诺() 在上下文中。(单元测试\业务功能\帐户分配.tests.js:21:99)


您没有正确地删除
entityTabs
,并且您正在测试的模块没有使用您的存根

更具体地说:您已经声明了一个本地var
let entityTabs然后分配该变量,
entityTabs=sinon.stub()。最后,您试图在该对象上删除一个方法
startAccountAssignment()
,但它没有这样的属性,因为它不是实际的
entityTabs
module/对象,并且根据您包含的代码片段,它甚至不是您正在测试的模块将使用的方法。


根据
entityTabs
对象的编写方式(它在自己的模块中吗?它是单例吗?它是类吗?),您需要导入它,并删除要模拟的方法,或者您想使用类似于模拟
entityTabs

的东西,与此无关,但用于获取信息-使用prototype关键字删除实例方法 i-e
sandbox.stub(deviceRegistryRepository.prototype,“getByName”).resolve()
对于静态方法,不需要使用prototype关键字

i-e
sandbox.stub(myStaticClass.prototype,“getMyStaticMethod”).resolve()

entityTabs是其自身模块中的一个类,因此在该函数所在的类中导入<代码>从“../business functions/entity navigation”导入EntityNavigation;const entityTabs=new EntityNavigation()谢谢,这正是我错过的!
 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;
        });
      });
    });
  });
});