You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Protractor/TypeScript async/await下mail-listener2无法连接邮箱及超时问题

Troubleshooting Jasmine Timeout with mailListener & TypeScript Async/Await

Looks like you're hitting a classic Jasmine async timeout issue—usually this happens when the test doesn't properly wait for your mailListener's asynchronous events to fire, or there's a misalignment between how you're using async/await and Jasmine's test lifecycle. Let's break down the most likely fixes:

1. Fix Async/Await & Jasmine Test Structure

Jasmine supports async/await natively, but mixing it with the done callback will cause timeouts. If your test uses async, don't pass done as a parameter—Jasmine will automatically wait for the promise returned by the async function to resolve/reject.

❌ Wrong:

it('should read emails', async (done) => {
  // Your code here
  done(); // This is redundant and can cause conflicts
});

✅ Correct:

it('should read emails', async () => {
  // Your code here, using await to wait for async operations
});

2. Ensure mailListener Events Are Firing

The timeout usually means your mail event isn't triggering at all. Add logging to confirm if the listener is actually receiving emails or hitting errors:

import { MailListener } from 'mail-listener6';
import emailConfig from './email';

const mailListener = new MailListener(emailConfig);

// Log every event to debug
mailListener.on('mail', (mail, seqno, attrs) => {
  console.log(`✅ Received email: ${mail.subject}`);
});

mailListener.on('error', (err) => {
  console.error(`❌ Mail listener error: ${err.message}`);
  // Fail the test immediately if there's an error to avoid timeouts
  fail(`Mail listener failed: ${err.message}`);
});

mailListener.on('server:connected', () => {
  console.log('🔌 Connected to mail server');
});

If you don't see these logs, double-check your email.ts config:

  • Verify IMAP server address, port, and SSL settings (most providers use SSL on port 993)
  • Confirm username/password are correct
  • Check if fetchUnreadOnStart is set to true if you're testing against unread emails
  • Ensure your email filter (if any) isn't excluding the test emails

3. Wrap mailListener Events in a Promise

Since mailListener uses event-based callbacks instead of promises, you'll need to wrap the mail event in a Promise to make it compatible with async/await in your test. This tells Jasmine exactly when to stop waiting:

it('should receive a test email', async () => {
  // Increase timeout if needed (default is 5000ms)
  jasmine.DEFAULT_TIMEOUT_INTERVAL = 15000;

  const mailListener = new MailListener(emailConfig);
  mailListener.start();

  // Create a promise that resolves when the first mail arrives
  const waitForEmail = new Promise((resolve) => {
    mailListener.once('mail', (mail) => resolve(mail));
  });

  // Wait for the email to arrive
  const receivedMail = await waitForEmail;

  // Add your assertions here
  expect(receivedMail.subject).toBe('Test Email Subject');

  // Clean up
  await mailListener.stop();
});

4. Properly Manage mailListener Lifecycle

Always start/stop the listener in beforeEach/afterEach to avoid resource leaks and ensure a fresh state for each test:

let mailListener: MailListener;

beforeEach(() => {
  mailListener = new MailListener(emailConfig);
  // Attach error handler here to catch issues early
  mailListener.on('error', (err) => fail(err));
});

afterEach(async () => {
  if (mailListener.isRunning()) {
    await mailListener.stop();
  }
});

it('should read emails correctly', async () => {
  mailListener.start();
  const waitForEmail = new Promise(resolve => mailListener.once('mail', resolve));
  const mail = await waitForEmail;
  expect(mail.from[0].address).toBe('test@example.com');
});

5. Check TypeScript Compilation Settings

Make sure your tsconfig.json supports async/await properly:

{
  "compilerOptions": {
    "target": "ES2017", // Or higher, to support async/await natively
    "module": "CommonJS",
    "strict": true,
    "esModuleInterop": true
  }
}

Quick Debug Checklist

  1. Do you see the server:connected log? If not, your config is wrong.
  2. Do you see errors in the console? Fix those first.
  3. Is your test email actually unread (if using fetchUnreadOnStart)?
  4. Are you mixing async with done in your test? Stop that.

内容的提问来源于stack exchange,提问作者Alexander Tunick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:29:57