Cucumber-js: Kesalahan: fungsi menggunakan beberapa antarmuka asinkron: panggilan balik dan janji

Dibuat pada 3 Jul 2017  ·  7Komentar  ·  Sumber: cucumber/cucumber-js

Halo semuanya,
Saya memiliki kasus di mana saya tidak dapat menggunakan async dalam definisi langkah.
Saya memiliki skenario sederhana di mana saya masuk melalui antarmuka api aplikasi saya untuk mengambil token auth
File fitur saya adalah:

Feature: Login
  Scenario: Login using api
    Given I login to my account with my username and password
    Then I should get an authorization token
      |username|password|
      |[email protected]|dev|

langkah saya adalah:

defineSupportCode(({ Given, Then, setDefaultTimeout }) => {
  const timeOut = 30000;
  const baseSteps: BaseSteps = new BaseSteps();
  setDefaultTimeout(timeOut);

  // tslint:disable-next-line:only-arrow-functions
  Given(/^I login to my account with my username and password$/, async (table: TableDefinition) => {
   const userData = table.hashes();

    const loginResponse =  await baseSteps.loginUser(userData[0].username, userData[0].password);


    console.log('Login response is ', loginResponse);
    const statusCode = 302;

    expect(await loginResponse.status).to.equal(statusCode);
  });

   Then(/^I should get an authorization token$/, async () => {
    const authorizationHeader = await baseSteps.getAuthorizationHeader();
    console.log('Auth Header', authorizationHeader);
    expect(authorizationHeader).to.not.equal(null);

    const orders = await fetch('url',
      {
        method: 'GET', headers: {
          authorization: authorizationHeader
        }
      });

    // tslint:disable-next-line:no-console
    console.log(await orders.json());
  });
});

Dan fungsi helper saya di BaseSteps.ts adalah sebagai berikut:

 async loginUser(userName: string, password: string): Promise<Response> {
    const getSignInFormResponse = await fetch(this.getInitialRequestUrl(),
      {
        method: 'GET'
      });

    const form = <some-form-data>;

    const loginResponse = await fetch(getSignInFormResponse.url,
      {
        method: 'POST',
        headers: {
          'content-type': 'application/x-www-form-urlencoded'
        },
        body: form,
        redirect: 'manual'
      });

      return loginResponse;
  }

async getAuthorizationHeader() {
    const tokenResponse = await fetch(this.getInitialRequestUrl(),
      {
        method: 'GET',
        redirect: 'manual'
      });

    const tokenInfo = qs.parse(tokenResponse.headers.get('location'));
    const authorizationHeader = `${tokenInfo.token_type} ${tokenInfo.access_token}`;

    return authorizationHeader;
  }

Ketika saya menjalankan skenario saya gagal dengan kesalahan berikut:

Error: function uses multiple asynchronous interfaces: callback and promise

di garis di mana Given saya dimulai

Tolong bantu saya memperbaiki kesalahan ini.

Komentar yang paling membantu

Anda Given langkah definisi memiliki table argumen sementara dalam file fitur Anda, itu tidak memiliki meja. Cucumber-js menentukan apakah Anda menggunakan antarmuka callback berdasarkan jumlah argumen dalam definisi langkah Anda. Jika jumlahnya satu lebih banyak dari jumlah argumen yang diteruskan, maka itu mengasumsikan Anda menggunakan antarmuka panggilan balik. Karena Anda juga mengembalikan janji, itu menentukan Anda menggunakan antarmuka janji. Hanya satu antarmuka pada satu waktu yang dapat digunakan.

Pikiran tentang memperbarui pesan kesalahan untuk memasukkan sesuatu tentang fakta bahwa antarmuka panggilan balik diasumsikan karena definisi langkah memiliki sejumlah argumen X?

Semua 7 komentar

Anda Given langkah definisi memiliki table argumen sementara dalam file fitur Anda, itu tidak memiliki meja. Cucumber-js menentukan apakah Anda menggunakan antarmuka callback berdasarkan jumlah argumen dalam definisi langkah Anda. Jika jumlahnya satu lebih banyak dari jumlah argumen yang diteruskan, maka itu mengasumsikan Anda menggunakan antarmuka panggilan balik. Karena Anda juga mengembalikan janji, itu menentukan Anda menggunakan antarmuka janji. Hanya satu antarmuka pada satu waktu yang dapat digunakan.

Pikiran tentang memperbarui pesan kesalahan untuk memasukkan sesuatu tentang fakta bahwa antarmuka panggilan balik diasumsikan karena definisi langkah memiliki sejumlah argumen X?

@charlierudolph Hai sobat, terima kasih atas balasan Anda, tetapi saya tidak begitu mengerti mengapa Anda mengatakan bahwa file fitur saya tidak memiliki tabel di dalamnya?

  Given I login to my account with my username and password
    Then I should get an authorization token
      |username|password|
      |[email protected]|dev|

bukankah bagaimana kita melewati tabel di file fitur?
Mengambil inspirasi dari sini https://github.com/cucumber/cucumber-js/blob/master/features/data_tables.feature

Ya pesan kesalahannya bisa sedikit lebih jelas..
Terima kasih lagi.

Maksud saya di file fitur Anda, langkah Then memiliki tabel tetapi langkah Given Anda tidak.

Uhh sialan.. Ya Anda benar.. Saya salah mengira meja sebagai example maaf atas kebingungannya. Saya kira itu akan baik-baik saja sekarang. Jika masalah berlanjut saya akan kembali untuk mengajukan pertanyaan lagi.

Menutup masalah karena @charlierudolph membantu saya mengetahui kesalahan pengkodean saya sendiri di file fitur.

Senang itu bekerja untuk Anda. Saya akan membuka masalah terpisah untuk memperbarui pesan kesalahan agar mudah-mudahan membuatnya lebih mudah untuk diketahui di masa mendatang

Utas ini telah dikunci secara otomatis karena tidak ada aktivitas terbaru setelah ditutup. Silakan buka edisi baru untuk bug terkait.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat