我正在尝试为我们小的但即将增长的testcafe业务功能库编写单元测试-即使用页面文件的thos库,以测试任何非简单逻辑。
为此,我正在尝试为此功能编写第一个单元测试 entityTabs-这是一个导入的异步模块,ui是一个导入的非异步模块,accountAssignmentControls是一个页面文件。这些提到的功能。在模块中进一步定义。 t是一个testcafe导入。
最初,我想保留所有功能并测试一次调用statAccountAssignments(此后,我将测试传入的数据的各种组合,但我无法超越第一个障碍)。 / p>
我UNIT测试了我们的非异步无头测试库,但是
其中一位开发人员添加了一些使用chair,mocha和sinon进行的单元测试-但是这些测试用于项目的非异步部分(主要是文件处理),因此我无法得到他写的内容。
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 \ regenerator-runtime \ runtime.js:65:40) 在Generator.invoke上[作为_invoke](node_modules \ regenerator-runtime \ runtime.js:303:22) 在Generator.prototype。(匿名函数)[下一个](node_modules \ regenerator-runtime \ runtime.js:117:21) 在步骤(单元测试\业务功能\帐户分配.tests.js:21:191) 在C:\ Projects \ Platform \ PlatformTesting \ UITests-NotProtractor \ unit-tests \ business-functions \ account-assignment.tests.js:21:437 在新的Promise() 在上下文。 (单元测试\业务功能\帐户分配.tests.js:21:99)
答案 0 :(得分:3)
与此无关,但仅供参考-使用 prototype 关键字来建立实例方法
即<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab_change_map_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
...
app:backgroundTint="@color/color_accent"
...
/>
对于静态方法,无需使用 prototype 关键字
即sandbox.stub(deviceRegistryRepository.prototype, "getByName").resolve();
答案 1 :(得分:2)
您没有正确输出entityTabs
,并且您正在测试的模块未使用您的存根。
更具体地说:您已经声明了本地变量let entityTabs;
,然后又分配了该变量entityTabs = sinon.stub();
。最后,您尝试在该对象上存根方法startAccountAssignment()
,但是它没有这样的属性,因为它不是实际的entityTabs
模块/对象,并且基于您所包含的代码片段, 这不是您正在测试的模块甚至不会使用的模块。
根据entityTabs
对象的编写方式(它在它自己的模块中吗?是一个单例吗?它是一个类吗?),您将需要导入它,并将所需的方法存根。模拟,或者您想使用类似proxyquire
的东西模拟entityTabs
。