在我看来,您应该重新考虑要测试什么以及如何测试。您可以测试是否从组件内部触发了某些内容(单元测试),例如如果我调用此函数,则此属性会更改值。
export class Page {
listOfSomething: string[] = [];
addStuff: (item: string) => this.listOfSomething.push(item);
}
在这里您可以测试listOfSomething 是否随时间变化。
要知道一个按钮是否从模板中的button 执行此操作,那么您可能会遇到这种情况
<p *ngFor="let item of listOfSomething">{{ item }}<p>
<button (click)="addStuff('stuff')">add stuff</button>
在这种情况下,您希望看到单击按钮后屏幕上的元素数量会发生变化。基本上你是在间接检查addStuff 和listOfSomething,但仍在检查它们。
--
总的来说,您需要将测试拆分为单元测试和 e2e 测试。
Jasmine 更适合单元测试。你可能会找到办法,但不值得花时间。
您可以在下面看到登录页面 (e2e) 所需的不同方法。
import { browser, by, element } from 'protractor';
export const testData = {
userName: 1231232,
password: 'pass1234'
};
export class LoginPage {
//////////////////////////////////////////////////////////////////////////////////////////
// navigate //////
navigateTo() {
return browser.get('/login');
}
quickLogin() {
this.navigateTo();
this.setMobileNumber(testData.userName);
this.setPassword(testData.password);
this.doLogin();
}
//////////////////////////////////////////////////////////////////////////////////////////
// selectors /////
getLoginButton() {
return element(by.buttonText('Log in'));
}
//////////////////////////////////////////////////////////////////////////////////////////
// getText ///////
getSelectedMobileNumberPrefix() {
return element(by.deepCss('section form .mat-select .value-output')).getText();
}
getErrorMessage() {
return element(by.deepCss('snack-bar-container simple-snack-bar span')).getText();
}
//////////////////////////////////////////////////////////////////////////////////////////
// sendKeys //////
setMobileNumber(phoneNumber: number) {
return element(by.css('[formControlName=phoneNumber]')).sendKeys(phoneNumber);
}
setPassword(password: string) {
return element(by.css('[formControlName=password]')).sendKeys(password);
}
//////////////////////////////////////////////////////////////////////////////////////////
// click /////////
doLogin() {
return this.getLoginButton().click();
}
}
import { browser, protractor } from 'protractor';
import { DashboardPage } from '../dashboard/dashboard.po';
import { LoginPage } from './login.po';
const password = {
correct: 'pass1234',
wrong: 'xxx',
};
const testData = {
maleUser: 1231232,
femaleUser: 1231231,
};
describe('Login Journey', () => {
const EC = protractor.ExpectedConditions;
let dashboardPage: DashboardPage;
let loginPage: LoginPage;
beforeEach(() => {
dashboardPage = new DashboardPage();
loginPage = new LoginPage();
});
afterEach(() => {
browser.executeScript('window.localStorage.clear();');
});
it('Checking init page', () => {
loginPage.navigateTo();
expect(loginPage.getSelectedMobileNumberPrefix()).toContain('+60');
expect(loginPage.getLoginButton().isEnabled()).toBeFalsy();
loginPage.setMobileNumber(testData.maleUser);
loginPage.setPassword(password.correct);
expect(loginPage.getLoginButton().isEnabled()).toBeTruthy();
expect(loginPage.getSelectedMobileNumberPrefix()).toContain('+60');
});
it('I should be able to login', () => {
loginPage.navigateTo();
loginPage.setMobileNumber(testData.maleUser);
loginPage.setPassword(password.correct);
loginPage.getLoginButton().click();
browser.waitForAngular();
expect(dashboardPage.getTitle()).toContain('Dashboard');
});
it('I should NOT be able to login with incorrect credentials', () => {
loginPage.navigateTo();
loginPage.setMobileNumber(testData.maleUser);
loginPage.setPassword(password.wrong);
loginPage.getLoginButton().click();
browser.waitForAngular();
expect(loginPage.getErrorMessage()).toContain('The email address or the password you inputted is incorrect.');
});
});