[英]Trying to make Cypress, TypeScript and IstanbulJS work together
[英]Cannot make Cypress and Pact work together
我已經有很少通過賽普拉斯測試的工作項目。 現在我正在嘗試使用 Cypress + Pact 添加合同測試
在開發人員控制台中,我可以看到該應用程序正在調用/api/v1/document-service
,但我得到:
契約驗證失敗 - 預期的交互與實際不匹配。
部分日志:
W, [2021-07-20T12:49:37.157389 #34805] WARN -- : Verifying - actual interactions do not match expected interactions.
Missing requests:
POST /api/v1/document-service
W, [2021-07-20T12:49:37.157489 #34805] WARN -- : Missing requests:
POST /api/v1/document-service
我在用着:
cypress: 7.5.0
@pact-foundation/pact: 9.16.0
我做過的步驟:
添加了 cypress 插件( https://github.com/pactflow/example-consumer-cypress/blob/master/cypress/plugins/cypress-pact.js )
添加命令( https://github.com/pactflow/example-consumer-cypress/blob/master/cypress/support/commands.js )
將配置添加到 cypress.json ( https://github.com/pactflow/example-consumer-cypress/blob/master/cypress.json ) - 如果我不想與真實服務器交互,不確定要放入 baseUrl 的內容.
添加測試:
let server; describe('Simple', () => { before(() => { cy.mockServer({ consumer: 'example-cypress-consumer', provider: 'pactflow-example-provider', }).then(opts => { cy.log(opts) server = opts }) }); beforeEach(() => { cy.fakeLogin() cy.addMockRoute({ server, as: 'products', state: 'products exist', uponReceiving: 'a request to all products', withRequest: { method: 'POST', path: '/api/v1/document-service', }, willRespondWith: { status: 200, body: { data: { collections: [ { id: '954', name: 'paystubs', }, { id: '1607', name: 'mystubs', }, ], }, }, }, }); }); it('is ok?', () => { cy.visit('/new/experiments/FirstProject/collections'); }); })
嘗試使用已棄用的cy.server()
/ cy.route()
和新的cy.intercept()
,但仍然驗證失敗。
在 Pactflow,我們花了大約 6 個月的時間一起使用 Cypress 和 Pact,使用 Pact 模擬服務從我們的 Cypress 測試中生成協議,如https://pactflow.io/blog/cypress-pact-front-end-testing 中的建議-有信心的/
由於以下原因,我們本周決定改變我們的方法。
我們的新方法是從我們的單元測試(而不是我們的 Cypress 測試)中生成我們的 Pact,並使用一個剝離 Pact 匹配器的函數在單元和 Cypress 測試之間共享夾具。 例如。
const SOME_INTERACTION = {
state: 'some state',
uponReceiving: "some request",
withRequest: {
method: "GET",
path: "/something"
},
willRespondWith: {
status: 200,
body: {
something: like("hello")
}
}
}
單元測試
describe('Something', () => {
let someProviderMockService
beforeAll(() => {
someProviderMockService = new Pact({
consumer: 'some-consumer',
provider: 'some-provider'
})
return someProviderMockService.setup()
})
afterAll(() => someProviderMockService.finalize())
afterEach(() => someProviderMockService.verify())
describe('loadSomething', () => {
beforeEach(() => {
return someProviderMockService.addInteraction(SOME_INTERACTION)
})
it('returns something', async () => {
const something = await loadSomething()
//expectations here
})
})
})
將 Pact 交互格式轉換為 Cypress 路由格式並去除 Pact 匹配器的函數。
const Matchers = require('@pact-foundation/pact-web').Matchers
// TODO map the request body and query parameters too
const toCypressInteraction = (interaction) => {
return {
method: interaction.withRequest.method,
url: Matchers.extractPayload(interaction.withRequest.path),
status: interaction.willRespondWith.status,
headers: Matchers.extractPayload(interaction.willRespondWith.headers),
response: Matchers.extractPayload(interaction.willRespondWith.body)
}
}
在賽普拉斯測試中
cy.route(toCypressInteraction(SOME_INTERACTION))
這種方法有以下好處:
我希望這些信息對您有所幫助。 我們現在推薦這種方法,而不是在 Cypress 測試中直接使用模擬服務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.