[英]How to inject Angular service for login in Cypress tests
我开始使用赛普拉斯测试我的 Angular 应用程序。 按照赛普拉斯的建议,我想通过在每次测试时绕过登录屏幕来节省测试时间,直接调用我的 Angular LoginService。
我按照这个例子: https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/logging-in__using-app-code作为基础(但它没有使用Angular服务)。
事情是这样的:
当应用程序正常运行时(在赛普拉斯之外),由于依赖注入,所有这些服务都会自动加载。
但是,从赛普拉斯测试中,我尝试了以下方法:
import { LoginService } from '../../src/app/services/login.service'
import { MyOwnService } from 'src/app/services/my-own.service'
import { HttpClient } from '@angular/common/http'
...
it('should work', () => {
let http = new HttpClient()
let snackBar = new MatSnackBar()
let router = new Router()
let myo = new MyOwnService(http, snackBar, router)
let ls = new LoginService(myo, http)
cy.wrap(ls.login({username: 'foo', password: 'bar'}), {}).then(user => {
cy.log("would be nice to reach this")
})
})
但它很丑,它不起作用,由于各种原因,包括从 Cypress 加载时,不再找到用于在 MyOwnService 代码中导入额外包的相对路径。
你有什么建议可以让依赖注入在赛普拉斯内部工作吗? 或任何工作代码示例?
非常感谢!
我找到了一种通过使用'Cypress' window 属性来解决它的方法。
if (!environment.production) { // instrument Cypress only out of PROD
if (window['Cypress']) {
window['LoginService'] = this
}
}
window['LoggedIn'] = true
Cypress.Commands.add("login", (email, password, url = '/') => {
cy.visit('/special/lightweight/component/to/route/fake/login')
cy.window().should('have.property', 'LoginService')
cy.window()
.then((w) => {
w.LoginService.login({ email, password }).subscribe(x => {
console.log("logged in")
})
})
cy.window().should('have.property', 'LoggedIn')
cy.visit(url)
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.