如何解决Rails 通过 /app 和 /spec
{大家好,
我们的团队有以下难题:
我们在 /spec 中有一些 rspec 测试,我们需要为它们存根请求,同时我们有 cypress 测试(/app 文件夹中的一个 cypress 控制器),我们也需要存根这些请求。我们使用 webmock;当我们添加存根时,存根逻辑结果是相同的。所以出现了一个问题,为什么不把存根逻辑放在一个地方,并将它包含在规范和 cypress 控制器中? (顺便说一下,这是一种反模式吗?)
我们想这样做,但我们把这个通用逻辑放在哪里?我们对一个地方对另一个地方没有很好的论据,所以任何想法都将不胜感激。
编辑: 一点解释:
- 我们有 rails 后端(GraphQL API)和 React 前端(由 rails 控制器提供服务)(由于从 rails mvc 应用程序几乎完成了长时间的过渡)。立>
- 我们进行了许多 rspec 测试,其中我们将所有对外部系统的请求进行了存根
- 我们有一些(不断增加的)cypress 集成测试,cypress 的工作方式是通过打开浏览器和模拟用户操作来模拟真实行为,并向后端发出请求。我们在应用程序中有一些 cypress 控制器来处理诸如创建测试数据(身份验证、工厂和模拟控制器)之类的事情。在模拟控制器中,我们将请求存根到一些外部系统(就像我们在 rspec 测试中所做的那样)
代码示例:
describe('Stripe Checkout',() => {
const amount = 1000;
const endOfYear = moment().endOf('year').format('MMYY');
beforeEach(() => {
cy.cleanBackend();
cy.cleanDatabase();
});
['usd','gbp','cad'].forEach((currency) => {
it(`Can checkout with Stripe ${currency}`,() => {
cy.mockBackendRequests({
stub_stripe_requests: true,stub_digitalinvoice_requests: true,stub_currency_layer_requests: [currency],});
cy.newGive('en',currency).then(({ intl,url }) => {
const { formatMessage } = intl;
cy.createRecords([
['create','donation_target','approved'],['create','approved',{ id: Cypress.env('GIVE_CHARITY') }],]).then(([donationTarget]) => {
cy.visit(url(`/donation-targets/${donationTarget.id}`));
addToCart({ donationTarget,amount,currency,intl });
goTroughCartPage({ donationTarget,url,intl });
fillPersonalForm({ intl,fillAddress: true });
cy.location('pathname').should('equal',url(`/checkout/payment`));
cy.get('main iframe')
.iframe()
.within(() => {
cy.get('[name="cardnumber"]')
.should('exist')
.and('not.be.disabled')
.type('4242424242424242',{ force: true,delay: 15 });
cy.get('[name="exp-date"]').focus().type(endOfYear);
cy.get('[name="cvc"]').focus().type('111');
cy.get('[name="postal"]').focus().type('22222');
});
cy.contains(formatMessage({ id: 'components.Payment.continue' })).click();
finishCheckout({ donationTarget,intl });
});
});
});
});
});
所以 createRecords 与工厂控制器对话并创建必要的测试数据,而 mockBackendRequests 与模拟控制器对话并创建所有必要的存根。例如,cleanBackend 和 cleanDatabase 命令也是对控制器的调用,它们按照他们所说的去做。
那么,我们的设置是否错误,如果不是,我们如何实现我的问题中的共享逻辑思想?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。