Rails 通过 /app 和 /spec

问题描述

{大家好,

我们的团队有以下难题:

我们在 /spec 中有一些 rspec 测试,我们需要为它们存根请求,同时我们有 cypress 测试(/app 文件夹中的一个 cypress 控制器),我们也需要存根这些请求。我们使用 webmock;当我们添加存根时,存根逻辑结果是相同的。所以出现了一个问题,为什么不把存根逻辑放在一个地方,并将它包含在规范和 cypress 控制器中? (顺便说一下,这是一种反模式吗?)

我们想这样做,但我们把这个通用逻辑放在哪里?我们对一个地方对另一个地方没有很好的论据,所以任何想法都将不胜感激。

编辑: 一点解释:

  1. 我们有 rails 后端(GraphQL API)和 React 前端(由 rails 控制器提供服务)(由于从 rails mvc 应用程序几乎完成了长时间的过渡)。立>
  2. 我们进行了许多 rspec 测试,其中我们将所有对外部系统的请求进行了存根
  3. 我们有一些(不断增加的)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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...