当前位置: 首页 > 知识库问答 >
问题:

获取类型错误:当插入异步方法时,无法存根不存在自己的属性

古起运
2023-03-14

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

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

最初,我想存根出所有的函数,并测试一次调用statAcCountAssignments(之后,我将测试传入的数据的各种组合,但我不能超越第一个障碍)。

I UNIT测试了我们的非异步无头测试库,但是

  • a) 这是非异步的

其中一位开发人员添加了一些使用chair、mocha和sinon的单元测试,但这些测试是针对项目的非异步部分(主要是文件处理),因此我无法得到他编写的应用程序。

未来

 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;
        });
      });
    });
  });
});

什么时候跑步

类型错误:无法存根不存在自己的属性在Sandbox.stub(node_modules\sinon\lib\sinon\sandbox.js:286: 19)在上下文中启动帐户分配。_callee$(C:/Projects/Platform/Platform/UITes-NotProtractor/unit-test/Business-函数/account-assignment.tests.js:49: 14)在tryCatch(node_modules#######################################################################################################################################################在C:\Projects\Platform\Platform\PlatformTest\UITes-NotProtractor\unit-test\Business-函数\account-assignment.tests.js:21: 437在Context的new Promise()的步骤(unit-test\Business-函数\account-assignment.tests.js:21: 191)。

共有2个答案

都超英
2023-03-14

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

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

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

梁池暝
2023-03-14

与此无关,但仅供参考-使用prototype关键字删除实例方法i-esandbox.stub(deviceRegistryRepository.prototype,“getByName”).resolve() sandbox.stub(myStaticClass.prototype,“getMyStaticMethod”).resolve()

 类似资料:
  • 我试图创建ionic构建,但出现错误,下面是我的步骤。 离子科尔多瓦平台移除Android 离子科尔多瓦平台添加Android 离子科尔多瓦构建Android 当我运行最后一个命令时,得到了下面的错误。 在1s中生成失败[ERROR]运行子进程Cordova时发生错误。

  • 我收到错误: 错误类型错误: 无法读取在评估 (webpack-internal:///./node_modules/@angular/common/esm5/http.js:163) 处未定义的属性 “长度”在 Array.forEach () 在 httpHeaders.lazyInit (webpack-internal:///./node_modules/@angular/common/e

  • 我正在上传一张图片到firebase,然后试图将它的下载URL保存到< code>ionic storage,但是它给了我这个错误

  • 我从micronaut下载。lanch是一个简单的grpc项目,在添加Kotlin grpc插件之前,我可以构建它。 除了build.gradle.kts的变化,没有什么比原来的脚手架项目。 我在build.gradle.kts.编辑 首先,为了匹配IntelliJ Kotlin版本 其次,为kotlin grpc proto自动生成的文件添加了文件夹 而最后 从INtelliJ或straigh命

  • 我的代码: 错误: 未处理PromisejectionWarning:TypeError:无法读取未定义的未处理PromisejectionWarning:未处理的promise拒绝的属性“forEach”。此错误源于在没有catch块的情况下抛出异步函数的内部,或者拒绝使用未处理的promise。catch()。(拒绝id:1)(节点:7188)[DEP0018]弃用警告:未处理的promise

  • 我试图使一个对话框弹出每当我得到一个错误从myerrorhandler我可以看到调用,但不是 这是我的错误消息。 错误类型错误:无法读取未定义的属性'openDialogTEST' 奇怪的是,如果我用按钮调用它,一切都很好。这是我的课程: usertable.component.ts auth.service.ts myerrorHandle.ts 对话框.component.ts 完整错误消息: